工廠模式的三種實現方式

文章目錄

    • 1.引出工廠模式
        • 具體需求
    • 2.傳統模式
        • 1.類圖
        • 2.目錄結構
        • 3.pizzastore 用于設計pizza
          • 1.Pizza.java 抽象的Pizza類型
          • 2.CheesePizaa.java CheesePizaa
          • 3.GreekPizza.java GreekPizza
        • 4.order 用于訂購和制作pizza
          • 1.OrderPizza.java 制作pizza
          • 2.PizzaStore.java 訂購pizza
        • 5.優缺點分析
    • 3.簡單工廠模式
        • 1.基本介紹
        • 2.類圖
        • 3.目錄結構
        • 4.orderbysimplefactory
          • 1.SimpleFactory.java 簡單工廠,根據類型來創建對象
          • 2.OrderPizzaBySimpleFactory.java 聚合一個工廠,來得到對象
          • 3.PizzaStoreBySimpleFactory.java 訂購pizza
        • 5.pizzastore 用于設計pizza跟上面的一樣
        • 6.簡單工廠模式的小結
    • 4.工廠方法模式
        • 1.具體需求引入工廠方法模式
        • 2.基本介紹
        • 3.類圖
        • 4.目錄結構
        • 5.pizzastore 設置pizza
          • 1.Pizza.java 抽象的Pizza類型
          • 2.BJCheesePizza.java
          • 3.BJPepperPizza.java
          • 4.LDCheesePizza.java
          • 5.LDPepperPizza.java
        • 6.order 制作pizza
          • 1.OrderPizza.java 制作Pizza的抽象類
          • 2.BJOrderPizza.java 根據不同的類型創建不同類型的BJpizza
          • 3.LDOrderPizza.java 根據不同的類型創建不同類型的LDpizza
          • 4.PizzaStore.java 訂購pizza
        • 7.工廠方法模式小結
    • 5.抽象工廠模式
        • 1.基本介紹
        • 2.類圖
        • 3.目錄結構
        • 4.order
          • 1.AbsFactory.java 抽象工廠
          • 2.BJFactory.java 北京的具體工廠
          • 3.LDFactory.java 倫敦的具體工廠
          • 4.OrderPizza.java 根據不同的具體工廠,和類型來制造對應的pizza
          • 5.PizzaStore.java 訂購pizza
    • 6.JDK源碼分析
        • 1.Calendar類使用了簡單工廠模式
        • 2.工廠模式小結

1.引出工廠模式

具體需求

image-20240527144734628

2.傳統模式

1.類圖

image-20240527155602819

2.目錄結構

3.pizzastore 用于設計pizza
1.Pizza.java 抽象的Pizza類型
package com.sun.simplefactory.pizzastore;/*** Description: 抽象的Pizza類型* @Author sun* @Create 2024/5/27 15:02* @Version 1.0*/
public abstract class Pizza {protected String name;public abstract void prepare();public void bake() {System.out.println(name + " baking;");}public void cut() {System.out.println(name + " cutting;");}public void box() {System.out.println(name + " boxing;");}public void setName(String name) {this.name = name;}
}
2.CheesePizaa.java CheesePizaa
package com.sun.simplefactory.pizzastore;/*** Description: CheesePizaa* @Author sun* @Create 2024/5/27 15:07* @Version 1.0*/
public class CheesePizaa extends Pizza {@Overridepublic void prepare() {System.out.println("CheesePizaa preparing;");}
}
3.GreekPizza.java GreekPizza
package com.sun.simplefactory.pizzastore;/*** Description: GreekPizza* @Author sun* @Create 2024/5/27 15:07* @Version 1.0*/
public class GreekPizza extends Pizza{@Overridepublic void prepare() {System.out.println("GreekPizza preparing;");}
}
4.order 用于訂購和制作pizza
1.OrderPizza.java 制作pizza
package com.sun.simplefactory.order;import com.sun.simplefactory.pizzastore.CheesePizaa;
import com.sun.simplefactory.pizzastore.GreekPizza;
import com.sun.simplefactory.pizzastore.Pizza;/*** Description: 制作pizza* @Author sun* @Create 2024/5/27 15:08* @Version 1.0*/
public class OrderPizza {// 根據用戶的輸入,返回對應的Pizza對象,獲取用戶的輸入public void createPizza(String orderType) {Pizza pizza = null;if (orderType.equals("greek")) {pizza = new GreekPizza();pizza.setName("GreekPizza");} else if (orderType.equals("cheese")) {pizza = new CheesePizaa();pizza.setName("CheesePizaa");}// 輸出pizza制作過程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}
}
2.PizzaStore.java 訂購pizza
package com.sun.simplefactory.order;/*** Description: 訂購pizza* @Author sun* @Create 2024/5/27 15:50* @Version 1.0*/
public class PizzaStore {public static void main(String[] args) {// 訂購pizza,相當于客戶端new OrderPizza().createPizza("greek");}
}
5.優缺點分析

image-20240527161644288

image-20240527160552499

image-20240527160715562

3.簡單工廠模式

1.基本介紹

image-20240527161004877

2.類圖

image-20240527170514320

3.目錄結構

image-20240527170721606

4.orderbysimplefactory
1.SimpleFactory.java 簡單工廠,根據類型來創建對象
package com.sun.simplefactory.orderbysimplefactory;import com.sun.simplefactory.pizzastore.CheesePizaa;
import com.sun.simplefactory.pizzastore.GreekPizza;
import com.sun.simplefactory.pizzastore.Pizza;/*** Description: 簡單工廠模式* @Author sun* @Create 2024/5/27 16:18* @Version 1.0*/
public class SimpleFactory {Pizza pizza = null;public Pizza createPizza(String orderType) {System.out.println("使用簡單工廠模式");// 根據用戶輸入的類型來獲取Pizza對象if (orderType.equals("greek")) {pizza = new GreekPizza();pizza.setName("GreekPizza");} else if (orderType.equals("cheese")) {pizza = new CheesePizaa();pizza.setName("CheesePizaa");}return pizza;}
}
2.OrderPizzaBySimpleFactory.java 聚合一個工廠,來得到對象
package com.sun.simplefactory.orderbysimplefactory;import com.sun.simplefactory.pizzastore.Pizza;/*** Description: 通過簡單工廠來訂購pizza* @Author sun* @Create 2024/5/27 16:39* @Version 1.0*/
public class OrderPizzaBySimpleFactory {// 定義一個簡單工廠的屬性private SimpleFactory simpleFactory;// 使用構造器創建一個對象并注入工廠public OrderPizzaBySimpleFactory(SimpleFactory simpleFactory) {setSimpleFactory(simpleFactory);}// 使用set方法聚合一個pizza的工廠public void setSimpleFactory(SimpleFactory simpleFactory) {this.simpleFactory = simpleFactory;// 記錄用戶輸入的pizza類型String orderType = "greek";// 根據用戶輸入的類型,從工廠中獲取一個該類型的pizzaPizza pizza = simpleFactory.createPizza(orderType);// 判斷是否獲取到了指定類型的pizzaif (pizza != null) {// 輸出pizza制作過程pizza.prepare();pizza.bake();pizza.cut();pizza.box();} else {System.out.println("訂購pizza失敗!");}}
}
3.PizzaStoreBySimpleFactory.java 訂購pizza
package com.sun.simplefactory.orderbysimplefactory;/*** Description:* @Author sun* @Create 2024/5/27 15:50* @Version 1.0*/
public class PizzaStoreBySimpleFactory {public static void main(String[] args) {// 訂購pizza,相當于客戶端new OrderPizzaBySimpleFactory(new SimpleFactory());}
}
5.pizzastore 用于設計pizza跟上面的一樣
6.簡單工廠模式的小結

需要根據類型的不同來創建不同的對象時,可將其做成一個簡單工廠

4.工廠方法模式

1.具體需求引入工廠方法模式

image-20240527183206377

2.基本介紹

image-20240527183303460

3.類圖

image-20240527184246448

4.目錄結構

image-20240527195350891

5.pizzastore 設置pizza
1.Pizza.java 抽象的Pizza類型
package com.sun.factorymethod.pizzastore;/*** Description: 抽象的Pizza類型* @Author sun* @Create 2024/5/27 15:02* @Version 1.0*/
public abstract class Pizza {protected String name;public abstract void prepare();public void bake() {System.out.println(name + " baking;");}public void cut() {System.out.println(name + " cutting;");}public void box() {System.out.println(name + " boxing;");}public void setName(String name) {this.name = name;}
}
2.BJCheesePizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:13* @Version 1.0*/
public class BJCheesePizza extends Pizza{@Overridepublic void prepare() {super.setName("北京的奶酪pizza");System.out.println("北京的奶酪pizza 準備原材料");}
}
3.BJPepperPizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:16* @Version 1.0*/
public class BJPepperPizza extends Pizza{@Overridepublic void prepare() {super.setName("北京的胡椒pizza");System.out.println("北京的胡椒pizza 準備原材料");}
}
4.LDCheesePizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:13* @Version 1.0*/
public class LDCheesePizza extends Pizza{@Overridepublic void prepare() {super.setName("倫敦的奶酪pizza");System.out.println("倫敦的奶酪pizza 準備原材料");}
}
5.LDPepperPizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:16* @Version 1.0*/
public class LDPepperPizza extends Pizza{@Overridepublic void prepare() {super.setName("倫敦的胡椒pizza");System.out.println("倫敦的胡椒pizza 準備原材料");}
}
6.order 制作pizza
1.OrderPizza.java 制作Pizza的抽象類
package com.sun.factorymethod.order;import com.sun.factorymethod.pizzastore.Pizza;/*** Description: 制作Pizza的抽象類* @Author sun* @Create 2024/5/27 19:21* @Version 1.0*/
public abstract class OrderPizza {abstract Pizza createPizza(String orderType);// 構造方法,當子類創建對象的時候就會調用public OrderPizza() {Pizza pizza = null;// 訂單的類型,子類根據訂單的類型來創建訂單String orderType = "cheese";pizza = this.createPizza(orderType);// 輸出pizza的制作過程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}
}
2.BJOrderPizza.java 根據不同的類型創建不同類型的BJpizza
package com.sun.factorymethod.order;import com.sun.factorymethod.pizzastore.BJCheesePizza;
import com.sun.factorymethod.pizzastore.BJPepperPizza;
import com.sun.factorymethod.pizzastore.Pizza;/*** Description:* @Author sun* @Create 2024/5/27 19:35* @Version 1.0*/
public class BJOrderPizza extends OrderPizza{@OverridePizza createPizza(String orderType) {// 根據不同的類型創建不同類型的pizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new BJCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new BJPepperPizza();}return pizza;}
}
3.LDOrderPizza.java 根據不同的類型創建不同類型的LDpizza
package com.sun.factorymethod.order;import com.sun.factorymethod.pizzastore.*;/*** Description:* @Author sun* @Create 2024/5/27 19:35* @Version 1.0*/
public class LDOrderPizza extends OrderPizza{@OverridePizza createPizza(String orderType) {// 根據不同的類型創建不同類型的pizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new LDCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new LDPepperPizza();}return pizza;}
}
4.PizzaStore.java 訂購pizza
package com.sun.factorymethod.order;/*** Description:* @Author sun* @Create 2024/5/27 19:48* @Version 1.0*/
public class PizzaStore {public static void main(String[] args) {// 創建北京口味的pizzaBJOrderPizza bjOrderPizza = new BJOrderPizza();// 創建倫敦口味的pizzaLDOrderPizza ldOrderPizza = new LDOrderPizza();}
}
7.工廠方法模式小結

每個方法都相當于一個工廠,能夠根據不同類型創建不同的對象,這里還結合了模板方法模式,當子類創建對象,會調用父類的構造器,而構造器內根據類型調用子類創建pizza的方法

5.抽象工廠模式

1.基本介紹

image-20240527200354850

2.類圖

image-20240527201557422

3.目錄結構

image-20240527204234481

4.order
1.AbsFactory.java 抽象工廠
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.Pizza;/*** Description: 抽象工廠* @Author sun* @Create 2024/5/27 20:20* @Version 1.0*/
public interface AbsFactory {Pizza createPizza(String orderType);
}
2.BJFactory.java 北京的具體工廠
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.*;/*** Description:* @Author sun* @Create 2024/5/27 20:22* @Version 1.0*/
public class BJFactory implements AbsFactory{@Overridepublic Pizza createPizza(String orderType) {// 根據不同的類型創建不同類型的BJpizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new BJCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new BJPepperPizza();}return pizza;}
}
3.LDFactory.java 倫敦的具體工廠
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.LDCheesePizza;
import com.sun.factorymethod.pizzastore.LDPepperPizza;
import com.sun.factorymethod.pizzastore.Pizza;/*** Description:* @Author sun* @Create 2024/5/27 20:22* @Version 1.0*/
public class LDFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {// 根據不同的類型創建不同類型的LDpizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new LDCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new LDPepperPizza();}return pizza;}
}
4.OrderPizza.java 根據不同的具體工廠,和類型來制造對應的pizza
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.Pizza;/*** Description:* @Author sun* @Create 2024/5/27 20:26* @Version 1.0*/
public class OrderPizza {// 聚合一個抽象工廠private AbsFactory absFactory;// 通過構造器再聚合一下public OrderPizza(AbsFactory absFactory) {this.setAbsFactory(absFactory);}public void setAbsFactory(AbsFactory absFactory) {this.absFactory = absFactory;Pizza pizza = null;// 訂單的類型,子類根據訂單的類型來創建訂單String orderType = "cheese";pizza = absFactory.createPizza(orderType);// 輸出pizza的制作過程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}
}
5.PizzaStore.java 訂購pizza
package com.sun.absfactory.order;/*** Description:* @Author sun* @Create 2024/5/27 20:39* @Version 1.0*/
public class PizzaStore {public static void main(String[] args) {// 使用倫敦的工廠,來訂購pizaaOrderPizza orderPizza = new OrderPizza(new LDFactory());}
}

6.JDK源碼分析

1.Calendar類使用了簡單工廠模式

image-20240527205010032

2.工廠模式小結

image-20240527205959020

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

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

相關文章

【Redis】 關于列表類型

文章目錄 🍃前言🍀常見操作命令介紹🚩lpush🚩lpushx🚩rpush🚩rpushx🚩lrange🚩lpop🚩rpop🚩lindex🚩linsert🚩llen🚩lrem&…

“按摩”科技?

都說A股股民是特別善于學習的,這不市場又現新概念——“按摩科技”,成立僅6年,把上門按摩干到35億營收也是沒誰了,現在號稱有1000萬用戶,3萬家入駐商戶數的按摩平臺,難道就憑借2.5萬名女技師,活…

【Django】中間件實現鉤子函數預處理和后處理,局部裝飾視圖函數

在app文件夾里新建middleware.py繼承MiddlewareMixin, 編寫中間件類,重寫process_request、process_response鉤子函數 from django.http import HttpRequest, HttpResponse from django.utils.decorators import decorator_from_middleware from django…

關于pytest中用例名稱使用中文亂碼的解決

場景:使用pytest.mark.parametrize裝飾器為用例自定義名稱時,運行顯示亂碼。如下圖所示: 解決方案: 1.在根目錄 pytest.ini中增加一行代碼 [pytest] disable_test_id_escaping_and_forfeit_all_rights_to_community_supportTrue…

NAT 網絡轉換

NAT(Network Address Translation) 網絡地址轉換 0x01 NAT 簡介 為什么要使用 NAT IPv4 網絡地址緊缺,從而出現了私有網段,來補充地址,但私有網段不課訪問 internet 所以出現了 NAT 地址轉換,將私有地址,轉換為公網 I…

一口氣看完es(上)

此系列博客分為上中下3篇:上篇是關于es的概念和對數據的增刪改操作,中篇是對數據的查詢、對搜索結果進行處理操作,下篇是介紹怎么在Java代碼中調用和操作es。 基本概念 1、es是什么?有什么作用? es全名是elasticsea…

關于0成本部署個人博客

分享一個文章關于零成本搭建個人博客 參考:‘關于部署博客hexoshokagithub的流程以及問題’ - 關于博客部署 | XiaoYang Guo Welcome to Guo Xiaoyangs personal blog 歡迎來到郭曉陽的個人博客 (1330303.github.io) 這個博主講的流程很全,而且回答也…

智慧管廊巡檢運維解決方案

一、智慧管廊巡檢行業目前存在的挑戰和難題 智慧管廊巡檢行業面臨著運行環境的客觀影響,如地面施工、液體滲漏、通風不佳、內部空間受限等問題。而管廊巡檢機器人系統的出現卻具有重大意義。它能夠有力地保障管廊安全且可靠地運行,在面對火情、災情等緊…

springboot基礎篇(快速入門+要點總結)

目錄 一、SpringBoot簡介 二、創建SpringBoot(通過Idea腳手架搭建項目) 三、properties配置文件 properties 配置文件說明 ①. properties 基本語法 ②. 讀取配置?件 ③. properties 缺點 2. yml 配置?件說明 ①. yml 基本語法 ②. yml 使用進…

上海AI lab發布MathBench,GPT-4o的數學能力有多強?

大模型數學能力哪家強? 最近,上海AI lab構建了一個全面的多語言數學基準——MathBench。與現有的基準不同的是,MathBench涵蓋從小學、初中、高中、大學不同難度,從基礎算術題到高階微積分、統計學、概率論等豐富類別的數學題目&a…

React項目知識積累(五)

1.dispatch、dev派發 src/models/formStatus.js: const FromStatusModel {namespace: "fromStatus",state: {isDisable: false,},reducers: {saveIsDisable(state, { payload }) {return {...state,...payload,};},}, };export default FromStatusModel; 改變和提…

【Linux】升級make(版本4.4.1)、升級gdb(版本14.1)、升級autoconf(版本2.71)

centos7升級make(版本4.4.1): make:編譯和構建工具。Linux中很多軟件包需要make編譯構建。官網:Make - GNU Project - Free Software Foundation 本次升級前的make版本是3.82,準備安裝的版本是4.4.1。make…

【Delphi 開箱即用 4】動態切換主題皮膚(明亮 or 暗黑)

Delphi的原始窗口界面看起來并不夠吸引人。嘗試下載并安裝第三方皮膚可能會導致應用程序尺寸急劇增加,并且可能會出現不穩定的情況。事實上,Delphi自帶了皮膚功能,完全可以滿足我們對窗口界面的美化需求,并且還支持動態切換皮膚。…

Hive的Sort by Order by Distribute by Cluster by

sort by是分區內排序,一個Reduce對一個Map的數據排序,效率高。 order by是全局排序,一個Reduce對所有Map內的數據排序,效率低。 distribute by 是對數據分區,根據字段哈希值取模來劃分到不容的MR內。注意哈希碰撞 哈…

Python I/O操作筆記

打開文件: 使用 open() 函數,其中文件路徑可以是相對路徑或絕對路徑。 模式除了常見的 r(只讀)、w(寫入,會覆蓋原有內容)、a(追加)外,還有一些其他組合模式&…

基于springboot實現旅游管理系統項目【項目源碼+論文說明】計算機畢業設計

基于springboot實現旅游管理系統演示 摘要 現代經濟快節奏發展以及不斷完善升級的信息化技術,讓傳統數據信息的管理升級為軟件存儲,歸納,集中處理數據信息的管理方式。本旅游管理系統就是在這樣的大環境下誕生,其可以幫助使用者在…

周報 | 24.5.20-24.5.26文章匯總

為了更好地整理文章和發表接下來的文章,以后每周都匯總一份周報。 OpenCV與AI深度學習 | YOLOv8自定義數據集訓練實現火焰和煙霧檢測(代碼數據集!)-CSDN博客 周報 | 24.5.13-24.5.19文章匯總-CSDN博客 DeepDriving | 目標檢測中…

來自Java的“菱形繼承“,你聽說過嗎?

一、菱形繼承的概念 菱形繼承又叫做鉆石繼承,指的是不同的類同時繼承自相同的父類,存在一個子類同時繼承這些不同的類,即我們常說的“多繼承”問題。 例如:B類和C類分別繼承A類,而D類同時繼承B類和C類。 如此圖所示 二…

Oladance、韶音、南卡開放式耳機選哪個?2024年主流產品硬核測評!

近期,不少朋友向我咨詢關于挑選開放式耳機的建議,希望找到既適合自己又具有高品質的選項。鑒于市場上開放式耳機品牌繁多,每款產品在音質、佩戴感受及整體性能上的表現各有千秋,正確選擇一款耳機成為了音樂愛好者們關注的焦點。錯…

R繪圖學習筆記

1、R語言繪制海岸線邊界 參考: Drawing beautiful maps programmatically with R, sf and ggplot2 — Part 1: Basics 使用R繪制世界地圖及緯度統計圖 Drawing maps with R. A basic tutorial:https://dr2blog.hcommons.org/2020/03/23/drawing-maps-wit…