工廠模式-依賴倒置原則

老板:阿飛啊,我們公司最近接了個項目,你看著設計一下,我給你說下需求。
項目組長阿飛:好啊,什么需求?
老板:我們找了一個合作的商鋪,他們要設計一套面包銷售系統。主要功能,根據用戶選擇的面包種類來下訂單,面包目前有奶油口味面包和蘋果口味面包,所有面包的制作流程都是---攪拌,搓圓,加工,烘烤。
項目組長阿飛:好的,我去想想怎么設計。
項目組長阿飛:小三啊,我給你個任務,…………,聽懂了嗎?
阿三:聽懂了,飛哥。
項目組長阿飛:嗯嗯,好的,這個任務就交給你了,我要去處理點事情,我相信你。
阿三:。。。
三天過后。
阿三:飛哥,設計好了,你看下。

 1 package com.factoryPattern.factory;
 2 
 3 /**
 4  * @program: designPattern
 5  * @description: 面包口味的抽象類
 6  * @author: Mr.Yang
 7  * @create: 2018-11-18 19:24
 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
?

現在已有的兩種口味繼承這個抽象類--奶油面包

 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";}//可以重寫父類方法,進行特殊處理
}
View Code
?

蘋果味面包

 1  package com.factoryPattern.breadKind;
 2  
 3  import com.factoryPattern.breadKind.factory.BreadFactory;
 4  
 5  /**
 6   * @program: designPattern
 7   * @description: 蘋果味面包
 8   * @author: Mr.Yang
 9   * @create:
10  **/
11 public class AppleBread extends BreadFactory {
12     public AppleBread(){
13         name="蘋果味";
14         type="1";
15     }
16     //可以重寫父類方法,進行特殊處理
17 }
View Code
?

然后是銷售系統

 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("創建奶油口味面包");
20             breadFactory=new CreamBread();
21         }else if("apple".equalsIgnoreCase(type)){
22             System.out.println("創建蘋果口味面包");
23             breadFactory=new AppleBread();
24         }else{
25             System.out.println("無法確認的面包類型");
26             return null;
27         }
28 
29         return breadFactory.stir()
30                 .rubbingRound()
31                 .machining()
32                 .bake();
33     }
34 }
View Code
?

項目組長阿飛:三啊,不錯,學會使用抽象了,但是如果我還要增加好幾種面包類型呢?阿爾法面包銷售不好,不想做這個了呢?之前給你說過設計模式的原則之一,對拓展開放,對修改關閉。如果有改動,可能會一直在這個代碼的基礎上累加做修改的。最好把創建對象的代碼與銷售的代碼分隔開。?
阿三:好的,我再修改修改(真的是,搞這么麻煩干嘛!)
又三天過后。
阿三:飛哥,修改好了,你看下。

新增了一個工程類

 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: 面包創建工程
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("創建奶油口味面包");
18             breadFactory=new CreamBread();
19         }else if("apple".equalsIgnoreCase(type)){
20             System.out.println("創建蘋果口味面包");
21             breadFactory=new AppleBread();
22         }else{
23             System.out.println("無法確認的面包類型");
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
?

項目組長阿飛:不錯,這是一個簡單工廠,但是你要記住,這并不是一個設計模式,而是一個編程習慣,一個不錯的編程習慣,簡單工廠把全部的事情,在一個地方處理完了,工廠方法是創建一個框架,讓子類決定如何實現。還有領導說需求變了,這個面包店開了分店,一個在泰國,一個在新加坡,你看著再修改下吧,你可以考慮加入工廠方法。?
阿三:好的(我服了,真的是****)
又三天過后。
阿三:飛哥,修改好了,這是完整代碼,你看下。
先是一個面包商店抽象類

 1  package com.factoryPattern.breadStore;
 2  
 3  import com.factoryPattern.factory.BreadFactory;
 4  
 5  /**
 6   * @program: designPattern
 7   * @description: 面包商店抽象類
 8   * @author: Mr.Yang
 9   * @create: -- :
10  **/
11 public abstract class BreadStoreFactory {
12 
13     public BreadFactory orderBread(String type) {
14         return createBread(type)
15                 .stir()
16                 .rubbingRound()
17                 .machining()
18                 .bake();
19     }
20 
21     abstract BreadFactory createBread(String type);
22 }
View Code
?

創建一個中國店鋪子類實現商店抽象類

 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: 中國店鋪子類
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("創建中國奶油口味面包");
19             breadFactory=new ChinaCreamBread();
20         }else if("apple".equalsIgnoreCase(type)){
21             System.out.println("創建中國蘋果口味面包");
22             breadFactory=new ChinaAppleBread();
23         }else{
24             System.out.println("無法確認的面包類型");
25             return null;
26         }
27         return breadFactory;
28     }
29 }
View Code
?

創建一個新加坡店鋪子類

 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: 新加坡店鋪子類
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("創建新加坡奶油口味面包");
19             breadFactory=new SingaporeCreamBread();
20         }else if("apple".equalsIgnoreCase(type)){
21             System.out.println("創建新加坡蘋果口味面包");
22             breadFactory=new SingaporeAppleBread();
23         }else{
24             System.out.println("無法確認的面包類型");
25             return null;
26         }
27         return breadFactory;
28     }
29 }
View Code

?

?

創建一個泰國店鋪子類

 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: 泰國店鋪子類
 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("創建泰國奶油口味面包");
18             breadFactory=new ThailandAppleBread();
19         }else if("apple".equalsIgnoreCase(type)){
20             System.out.println("創建泰國蘋果口味面包");
21             breadFactory=new ThailandAppleBread();
22         }else{
23             System.out.println("無法確認的面包類型");
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

?

?

中國蘋果口味面包

 1  package com.factoryPattern.kind;
 2  
 3  import com.factoryPattern.factory.BreadFactory;
 4  
 5  /**
 6   * @program: designPattern
 7   * @description: 中國蘋果口味面包
 8   * @author: Mr.Yang
 9   * @create: -- :
10  **/
11 public class ChinaAppleBread  extends BreadFactory {
12     public ChinaAppleBread(){
13         name="中國蘋果口味";
14         type="";
15     }
16     //可以重寫父類方法,進行特殊處理
17 }
View Code
?

中國奶油口味面包

 1  package com.factoryPattern.kind;
 2  
 3  import com.factoryPattern.factory.BreadFactory;
 4  
 5  /**
 6   * @program: designPattern
 7   * @description: 中國奶油口味面包
 8   * @author: Mr.Yang
 9   * @create: -- :
10  **/
11 public class ChinaCreamBread extends BreadFactory {
12     public ChinaCreamBread(){
13         name="中國奶油口味";
14         type="";
15     }
16     //可以重寫父類方法,進行特殊處理
View Code

?

?

還有新加坡蘋果口味面包,新加坡奶油口味面包,泰國蘋果口味面包,泰國奶油口味面包

測試類

 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: 測試類
 9   * @author: Mr.Yang
10  * @create: -- :
11  **/
12 public class Test {
13     public static void main(String[] args) {
14         System.out.println("中國顧客買蘋果味道面包");
15         BreadStoreFactory chinaBreadStoreFactory = new ChinaStore();
16         chinaBreadStoreFactory.orderBread("apple");
17     }
18 }
View Code

?

?

測試結果

1 中國顧客買蘋果味道面包
2 創建中國蘋果口味面包
3 攪拌
4 搓圓
5 加工
6 烘烤
?

項目組長阿飛:看著不錯,給我講解一下吧。
阿三:我所用的是設計模式中的工廠模式,讓子類決定該創建的對象是什么,來達到將對象創建的過程封裝的目的。我簡單的畫了個圖

?

?

阿三:大致如圖,工程模式的定義:定義了一個創建對象的接口,但有子類決定要實例化的類是哪一個。工程方法讓類把實例化推遲到子類

項目組長阿飛:很好,看來你已經掌握了工程模式的精髓,工程模式遵循了一個設計原則:“要依賴抽象,不要依賴具體實現。”,它有一個響亮的名字:“依賴倒置原則”。?你看你這兩個圖。創建者抽象BreadStoreFactory依賴與BreadFactory抽象類,面包的具體實現(chinaAppleBread,chinaCreamBread)依賴與BreadFactory抽象類,想要遵循依賴倒置原則,工程方法并非是唯一的,但是確是最有威力的技巧之一。

阿三:好的(我早就知道了---膨脹的一批)

?

轉載于:https://www.cnblogs.com/yangxiaojie/p/10010284.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395941.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

aws lambda_如何通過在本地模擬AWS Lambda來加速無服務器開發

aws lambdaby John McKim約翰麥金(John McKim) 如何通過在本地模擬AWS Lambda來加速無服務器開發 (How you can speed up serverless development by simulating AWS Lambda locally) Designing AWS Lambda functions can be a frustrating experience. Each time you make a …

(6)css盒子模型(基礎下)

一、理解多個盒子模型之間的相互關系 現在大部分的網頁都是很復雜的,原因是一個“給人用的”網頁中是可能存在著大量的盒子,并且它們以各種關系相互影響著。 html與DOM的關系 詳情了解“DOM” :http://baike.baidu.com/link?urlSeSj8sRDE-JZ…

easyui獲取下拉框選中的文本值_Word中文本顯示不全的常見3種情況及解決方法

在日常工作使用Word文檔時,經常會遇到文本顯示不全的情況,比如文本框或表格里的文本顯示不全等情況,你一般是怎么操作呢?以下這3種常見情況你可能也遇到過,一起看看是什么原因并解決它們吧!1、文本顯示不全…

企業IT架構轉型之道:阿里巴巴中臺戰略思想與架構實戰. 導讀

企業IT架構轉型之道 阿里巴巴中臺戰略思想與架構實戰 鐘 華 編 著 前 言  在過去15年的IT從業經歷中,有很長一段時間我都是以軟件服務商的身份參與了企業的IT系統建設,對于過去十幾年來企業IT的發展有一定的認知和理解,帶著對互聯網技術…

計算機軟件技術大作業報告,多媒體技術大作業報告.doc

多媒體技術大作業報告.doc華南理工大學多媒體技術大作業報告專 業:班 級:學 號:學生姓名:完成時間:目錄說 明 ……………………………………………………3第一章概述 …………………………………………………4第二章技…

ES6入門之Generator函數

Generator Generator函數是ES6提供的一種異步編程解決方案,Generator函數是一個狀態機,封裝了多個內部狀態。 執行Generator函數會返回一個遍歷器對象,也就是說,Generator函數除了狀態機,還是一個遍歷器對象生成函數。…

reddit_Reddit如何設計和編碼其詳盡的愚人節體驗,/ r / place

redditHere are three links worth your time:這是三個值得您花費時間的鏈接: How Reddit designed and coded its elaborate April Fool’s experience, /r/place (17 minute read) Reddit如何設計和編碼其詳盡的愚人節經驗/ r / place( 閱讀17分鐘 ) These hacka…

CSS中屬性的值和單位

CSS中值的單位 1.顏色值 被各種瀏覽器支持,并且作為 CSS 規范推薦的顏色名稱只有 16 種,如下表所示。 百分比表示 color: rgb(100%, 100%, 100%); 這個聲明將紅、藍、綠 3 種原色都設置為最大值,結果組合顯示為白色。相反,可以設置…

mysql能否在手機端運行_在手機上安裝linux并部署mysql,jupyter用于數據探索

因為現在有一臺舊手機放在學校,之前使用的軟路由內存只有128M,不方便存一些小的數據.手機的好處是可以一直開著,因此在手機上安裝linux來替代樹莓派做服務器是可行的(由于不需要對外,所以也不用購買服務器).安裝linux首先安裝busybox1.對于busybox,進入左上角settings,設置inst…

《走進SAP(第2版)》——2.8 SAP的目標是什么

本節書摘來自異步社區《走進SAP(第2版)》一書中的第2章,第2.8節,作者: 【德】Nancy Muir , Ian Kimbell , 等 更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.8 SAP的目標是什么 走進SAP(第2版)…

尼康d850相機參數測試軟件,尼康 - D850 - 產品介紹

類型數碼單鏡反光相機鏡頭卡口尼康F卡口(帶有AF耦合和AF接點)有效視角尼康FX格式影像傳感器格式FX格式影像傳感器類型CMOS傳感器有效像素數約4,575萬影像傳感器約35.9mm x 23.9mm總像素數約4,689萬灰塵減少功能清潔影像傳感器圖像尺寸(像素)-FX (36x24) 影像區域(L) 8256 x 550…

我如何構建Kubernetes集群,以便我的同事可以更快地部署應用程序

by cheungpat通過cheungpat 我如何構建Kubernetes集群,以便我的同事可以更快地部署應用程序 (How I built a Kubernetes cluster so my coworkers could deploy apps faster) How do you encourage your development team to build more projects without being bo…

使用uWSGI部署django項目

先說說什么是uWSGI吧,他是實現了WSGI協議、uwsgi、http等協議的一個web服務器,那什么是WSGI呢? WSGI是一種Web服務器網關接口。它是一個Web服務器(如nginx)與應用服務器(如uWSGI服務器)通信的一…

8 包含min函數的棧

0 引言 題目:定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。在該棧中,調用min、push及pop的時間復雜度都是O(1). 1 抽象問題具體化 2 具體問題抽象分析 需要解決的兩個主要問題如下。 &#x…

《Adobe Illustrator大師班:經典作品與完美技巧賞析》—Svetlana Makarova

本節書摘來自異步社區《Adobe Illustrator大師班:經典作品與完美技巧賞析》一書中的Svetlana Makarova,作者【英】Sharon Milne,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 Svetlana MakarovaAdobe Illustrator大師班:經典作品與…

navicat無法連接遠程mysql數據庫_navicat無法遠程連接mysql的解決方法

近日在Ubuntu上安裝了一個 MySQL 5.0,因為使用 phpMyAdmin 還必須安裝 PHP,所以打算直接使用遠程管理工具Navicat for MySQL 來連接。在 Ubuntu 中通過 mysql 命令行創建好一個數據表并分配了權限:代碼如下:GRANT ALL ON testdb.* TO usera I…

有關軟件測試的證書,軟件測試證書有用嗎

要想知道證書有什么用,我們就要詳細了解軟件評測師考試,以及拿到證書的價值。那么下面和小編來看看這篇軟件測試證書有用嗎,一定會有收獲。一、證書考試軟件評測師考試是全國計算機技術與軟件技術資格考試的一個中級考試。考試不規定學歷和資…

計算機科學導論第五版_五月份將開始提供438項免費在線編程和計算機科學課程

計算機科學導論第五版Five years ago, universities like MIT and Stanford first opened up free online courses to the public. Today, more than 700 schools around the world have created thousands of free online courses.五年前,麻省理工學院和斯坦福大學…

python D29 socketserver以及FTB

一、socketserver 基于tcp協議下的socket只能和一個客戶端通信,如果用socketserver可以實現和多個客戶端通信。 他是在socket的基礎上進行封裝,也就是說底層還是調用的socket,在py2.7里面叫做SocketServer也就是大寫了兩個S,在py3…

計算機節電模式不能打開,電腦進入節電模式打不開怎么辦

大家好,我是時間財富網智能客服時間君,上述問題將由我為大家進行解答。電腦進入節電模式打不開的原因及解決方法如下:1、顯示器和顯卡接觸不良解決辦法:檢查顯示器和顯卡的連接是否正確,接觸是否良好;2、顯…