工厂模式-依赖倒置原则
老板:阿飛啊,我們公司最近接了個(gè)項(xiàng)目,你看著設(shè)計(jì)一下,我給你說(shuō)下需求。
項(xiàng)目組長(zhǎng)阿飛:好啊,什么需求?
老板:我們找了一個(gè)合作的商鋪,他們要設(shè)計(jì)一套面包銷售系統(tǒng)。主要功能,根據(jù)用戶選擇的面包種類來(lái)下訂單,面包目前有奶油口味面包和蘋(píng)果口味面包,所有面包的制作流程都是---攪拌,搓圓,加工,烘烤。
項(xiàng)目組長(zhǎng)阿飛:好的,我去想想怎么設(shè)計(jì)。
項(xiàng)目組長(zhǎng)阿飛:小三啊,我給你個(gè)任務(wù),…………,聽(tīng)懂了嗎?
阿三:聽(tīng)懂了,飛哥。
項(xiàng)目組長(zhǎng)阿飛:嗯嗯,好的,這個(gè)任務(wù)就交給你了,我要去處理點(diǎn)事情,我相信你。
阿三:。。。
三天過(guò)后。
阿三:飛哥,設(shè)計(jì)好了,你看下。
現(xiàn)在已有的兩種口味繼承這個(gè)抽象類--奶油面包
package com.factoryPattern.breadKind;import com.factoryPattern.breadKind.factory.BreadFactory;/*** @program: designPattern* @description: 奶油味面包* @author: Mr.Yang* @create:**/ public class CreamBread extends BreadFactory {public CreamBread(){name="奶油味";type="2";}//可以重寫(xiě)父類方法,進(jìn)行特殊處理 } View Code ?蘋(píng)果味面包
1 package com.factoryPattern.breadKind; 2 3 import com.factoryPattern.breadKind.factory.BreadFactory; 4 5 /** 6 * @program: designPattern 7 * @description: 蘋(píng)果味面包 8 * @author: Mr.Yang 9 * @create: 10 **/ 11 public class AppleBread extends BreadFactory { 12 public AppleBread(){ 13 name="蘋(píng)果味"; 14 type="1"; 15 } 16 //可以重寫(xiě)父類方法,進(jìn)行特殊處理 17 } View Code ?然后是銷售系統(tǒng)
1 package com.factoryPattern.breadKind.breadOrder; 2 3 import com.factoryPattern.breadKind.AppleBread; 4 import com.factoryPattern.breadKind.CreamBread; 5 import com.factoryPattern.breadKind.factory.BreadFactory; 6 7 /** 8 * @program: designPattern 9 * @description: 面包訂單銷售類 10 * @author: Mr.Yang 11 * @create: 12 **/ 13 public class BreadOrder { 14 15 16 BreadFactory orderBread(String type){ 17 BreadFactory breadFactory; 18 if("cream".equalsIgnoreCase(type)){ 19 System.out.println("創(chuàng)建奶油口味面包"); 20 breadFactory=new CreamBread(); 21 }else if("apple".equalsIgnoreCase(type)){ 22 System.out.println("創(chuàng)建蘋(píng)果口味面包"); 23 breadFactory=new AppleBread(); 24 }else{ 25 System.out.println("無(wú)法確認(rèn)的面包類型"); 26 return null; 27 } 28 29 return breadFactory.stir() 30 .rubbingRound() 31 .machining() 32 .bake(); 33 } 34 } View Code ?項(xiàng)目組長(zhǎng)阿飛:三啊,不錯(cuò),學(xué)會(huì)使用抽象了,但是如果我還要增加好幾種面包類型呢?阿爾法面包銷售不好,不想做這個(gè)了呢?之前給你說(shuō)過(guò)設(shè)計(jì)模式的原則之一,對(duì)拓展開(kāi)放,對(duì)修改關(guān)閉。如果有改動(dòng),可能會(huì)一直在這個(gè)代碼的基礎(chǔ)上累加做修改的。最好把創(chuàng)建對(duì)象的代碼與銷售的代碼分隔開(kāi)。?
阿三:好的,我再修改修改(真的是,搞這么麻煩干嘛!)
又三天過(guò)后。
阿三:飛哥,修改好了,你看下。
新增了一個(gè)工程類
1 package com.factoryPattern.breadCreate; 2 3 import com.factoryPattern.breadKind.AppleBread; 4 import com.factoryPattern.breadKind.CreamBread; 5 import com.factoryPattern.breadKind.factory.BreadFactory; 6 7 /** 8 * @program: designPattern 9 * @description: 面包創(chuàng)建工程 10 * @author: Mr.Yang 11 * @create: 12 **/ 13 public class BreadCreateFactory { 14 public BreadFactory createBread(String type){ 15 BreadFactory breadFactory=null; 16 if("cream".equalsIgnoreCase(type)){ 17 System.out.println("創(chuàng)建奶油口味面包"); 18 breadFactory=new CreamBread(); 19 }else if("apple".equalsIgnoreCase(type)){ 20 System.out.println("創(chuàng)建蘋(píng)果口味面包"); 21 breadFactory=new AppleBread(); 22 }else{ 23 System.out.println("無(wú)法確認(rèn)的面包類型"); 24 return null; 25 } 26 return breadFactory; 27 } 28 } View Code修改了銷售類
1 package com.factoryPattern.breadKind.breadOrder; 2 3 import com.factoryPattern.breadCreate.BreadCreateFactory; 4 import com.factoryPattern.breadKind.factory.BreadFactory; 5 6 /** 7 * @program: designPattern 8 * @description: 面包訂單銷售類 9 * @author: Mr.Yang 10 * @create: 11 **/ 12 public class BreadOrder { 13 BreadCreateFactory breadCreateFactory; 14 15 public BreadOrder(BreadCreateFactory breadCreateFactory) { 16 this.breadCreateFactory = breadCreateFactory; 17 } 18 19 BreadFactory orderBread(String type) { 20 return breadCreateFactory.createBread(type) 21 .stir() 22 .rubbingRound() 23 .machining() 24 .bake(); 25 } 26 } View Code ?項(xiàng)目組長(zhǎng)阿飛:不錯(cuò),這是一個(gè)簡(jiǎn)單工廠,但是你要記住,這并不是一個(gè)設(shè)計(jì)模式,而是一個(gè)編程習(xí)慣,一個(gè)不錯(cuò)的編程習(xí)慣,簡(jiǎn)單工廠把全部的事情,在一個(gè)地方處理完了,工廠方法是創(chuàng)建一個(gè)框架,讓子類決定如何實(shí)現(xiàn)。還有領(lǐng)導(dǎo)說(shuō)需求變了,這個(gè)面包店開(kāi)了分店,一個(gè)在泰國(guó),一個(gè)在新加坡,你看著再修改下吧,你可以考慮加入工廠方法。?
阿三:好的(我服了,真的是****)
又三天過(guò)后。
阿三:飛哥,修改好了,這是完整代碼,你看下。
先是一個(gè)面包商店抽象類
創(chuàng)建一個(gè)中國(guó)店鋪?zhàn)宇悓?shí)現(xiàn)商店抽象類
1 package com.factoryPattern.breadStore; 2 3 import com.factoryPattern.factory.BreadFactory; 4 import com.factoryPattern.kind.ChinaAppleBread; 5 import com.factoryPattern.kind.ChinaCreamBread; 6 7 /** 8 * @program: designPattern 9 * @description: 中國(guó)店鋪?zhàn)宇?10 * @author: Mr.Yang 11 * @create: -- : 12 **/ 13 public class ChinaStore extends BreadStoreFactory{ 14 @Override 15 BreadFactory createBread(String type) { 16 BreadFactory breadFactory=null; 17 if("cream".equalsIgnoreCase(type)){ 18 System.out.println("創(chuàng)建中國(guó)奶油口味面包"); 19 breadFactory=new ChinaCreamBread(); 20 }else if("apple".equalsIgnoreCase(type)){ 21 System.out.println("創(chuàng)建中國(guó)蘋(píng)果口味面包"); 22 breadFactory=new ChinaAppleBread(); 23 }else{ 24 System.out.println("無(wú)法確認(rèn)的面包類型"); 25 return null; 26 } 27 return breadFactory; 28 } 29 } View Code創(chuàng)建一個(gè)新加坡店鋪?zhàn)宇?/p> 1 package com.factoryPattern.breadStore; 2 3 import com.factoryPattern.factory.BreadFactory; 4 import com.factoryPattern.kind.SingaporeAppleBread; 5 import com.factoryPattern.kind.SingaporeCreamBread; 6 7 /** 8 * @program: designPattern 9 * @description: 新加坡店鋪?zhàn)宇?10 * @author: Mr.Yang 11 * @create: -- : 12 **/ 13 public class SingaporeStore extends BreadStoreFactory { 14 @Override 15 BreadFactory createBread(String type) { 16 BreadFactory breadFactory=null; 17 if("cream".equalsIgnoreCase(type)){ 18 System.out.println("創(chuàng)建新加坡奶油口味面包"); 19 breadFactory=new SingaporeCreamBread(); 20 }else if("apple".equalsIgnoreCase(type)){ 21 System.out.println("創(chuàng)建新加坡蘋(píng)果口味面包"); 22 breadFactory=new SingaporeAppleBread(); 23 }else{ 24 System.out.println("無(wú)法確認(rèn)的面包類型"); 25 return null; 26 } 27 return breadFactory; 28 } 29 } View Code
?
創(chuàng)建一個(gè)泰國(guó)店鋪?zhàn)宇?/p> 1 package com.factoryPattern.breadStore; 2 3 import com.factoryPattern.factory.BreadFactory; 4 import com.factoryPattern.kind.ThailandAppleBread; 5 6 /** 7 * @program: designPattern 8 * @description: 泰國(guó)店鋪?zhàn)宇? 9 * @author: Mr.Yang 10 * @create: -- : 11 **/ 12 public class ThailandStore extends BreadStoreFactory { 13 @Override 14 BreadFactory createBread(String type) { 15 BreadFactory breadFactory=null; 16 if("cream".equalsIgnoreCase(type)){ 17 System.out.println("創(chuàng)建泰國(guó)奶油口味面包"); 18 breadFactory=new ThailandAppleBread(); 19 }else if("apple".equalsIgnoreCase(type)){ 20 System.out.println("創(chuàng)建泰國(guó)蘋(píng)果口味面包"); 21 breadFactory=new ThailandAppleBread(); 22 }else{ 23 System.out.println("無(wú)法確認(rèn)的面包類型"); 24 return null; 25 } 26 return breadFactory; 27 } 28 } View Code
?
面包口味的抽象類
1 package com.factoryPattern.factory; 2 3 /** 4 * @program: designPattern 5 * @description: 面包口味的抽象類 6 * @author: Mr.Yang 7 * @create: -- : 8 **/ 9 public abstract class BreadFactory { 10 protected String name; 11 protected String type; 12 13 public BreadFactory stir(){ 14 System.out.println("攪拌"); 15 return this; 16 } 17 18 public BreadFactory rubbingRound(){ 19 System.out.println("搓圓"); 20 return this; 21 } 22 23 public BreadFactory machining(){ 24 System.out.println("加工"); 25 return this; 26 } 27 public BreadFactory bake(){ 28 System.out.println("烘烤"); 29 return this; 30 } 31 32 public String getName() { 33 return name; 34 } 35 36 public BreadFactory setName(String name) { 37 this.name = name; 38 return this; 39 } 40 41 public String getType() { 42 return type; 43 } 44 45 public BreadFactory setType(String type) { 46 this.type = type; 47 return this; 48 } 49 } View Code?
?中國(guó)蘋(píng)果口味面包
1 package com.factoryPattern.kind; 2 3 import com.factoryPattern.factory.BreadFactory; 4 5 /** 6 * @program: designPattern 7 * @description: 中國(guó)蘋(píng)果口味面包 8 * @author: Mr.Yang 9 * @create: -- : 10 **/ 11 public class ChinaAppleBread extends BreadFactory { 12 public ChinaAppleBread(){ 13 name="中國(guó)蘋(píng)果口味"; 14 type=""; 15 } 16 //可以重寫(xiě)父類方法,進(jìn)行特殊處理 17 } View Code ?中國(guó)奶油口味面包
1 package com.factoryPattern.kind; 2 3 import com.factoryPattern.factory.BreadFactory; 4 5 /** 6 * @program: designPattern 7 * @description: 中國(guó)奶油口味面包 8 * @author: Mr.Yang 9 * @create: -- : 10 **/ 11 public class ChinaCreamBread extends BreadFactory { 12 public ChinaCreamBread(){ 13 name="中國(guó)奶油口味"; 14 type=""; 15 } 16 //可以重寫(xiě)父類方法,進(jìn)行特殊處理 View Code?
?還有新加坡蘋(píng)果口味面包,新加坡奶油口味面包,泰國(guó)蘋(píng)果口味面包,泰國(guó)奶油口味面包
測(cè)試類
1 package com.factoryPattern.patternTest; 2 3 import com.factoryPattern.breadStore.BreadStoreFactory; 4 import com.factoryPattern.breadStore.ChinaStore; 5 6 /** 7 * @program: designPattern 8 * @description: 測(cè)試類 9 * @author: Mr.Yang 10 * @create: -- : 11 **/ 12 public class Test { 13 public static void main(String[] args) { 14 System.out.println("中國(guó)顧客買蘋(píng)果味道面包"); 15 BreadStoreFactory chinaBreadStoreFactory = new ChinaStore(); 16 chinaBreadStoreFactory.orderBread("apple"); 17 } 18 } View Code?
?測(cè)試結(jié)果
1 中國(guó)顧客買蘋(píng)果味道面包 2 創(chuàng)建中國(guó)蘋(píng)果口味面包 3 攪拌 4 搓圓 5 加工 6 烘烤 ?項(xiàng)目組長(zhǎng)阿飛:看著不錯(cuò),給我講解一下吧。
阿三:我所用的是設(shè)計(jì)模式中的工廠模式,讓子類決定該創(chuàng)建的對(duì)象是什么,來(lái)達(dá)到將對(duì)象創(chuàng)建的過(guò)程封裝的目的。我簡(jiǎn)單的畫(huà)了個(gè)圖
?
?
阿三:大致如圖,工程模式的定義:定義了一個(gè)創(chuàng)建對(duì)象的接口,但有子類決定要實(shí)例化的類是哪一個(gè)。工程方法讓類把實(shí)例化推遲到子類
項(xiàng)目組長(zhǎng)阿飛:很好,看來(lái)你已經(jīng)掌握了工程模式的精髓,工程模式遵循了一個(gè)設(shè)計(jì)原則:“要依賴抽象,不要依賴具體實(shí)現(xiàn)。”,它有一個(gè)響亮的名字:“依賴倒置原則”。?你看你這兩個(gè)圖。創(chuàng)建者抽象BreadStoreFactory依賴與BreadFactory抽象類,面包的具體實(shí)現(xiàn)(chinaAppleBread,chinaCreamBread)依賴與BreadFactory抽象類,想要遵循依賴倒置原則,工程方法并非是唯一的,但是確是最有威力的技巧之一。
阿三:好的(我早就知道了---膨脹的一批)
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangxiaojie/p/10010284.html
總結(jié)
以上是生活随笔為你收集整理的工厂模式-依赖倒置原则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 女人梦到好多蛇是什么意思
- 下一篇: 女子梦到狗扑向自己是什么意思
