日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

创建型设计模式——抽象工厂模式

發布時間:2024/1/1 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建型设计模式——抽象工厂模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.什么是抽象工廠模式?

  • 抽象工廠模式:? 定義了一個interface用于創建相關或有依賴關系的對象簇,而無需指明具體的類。
  • 抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合。
  • 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者稱為進一步的抽象)。
  • 將工廠抽象成兩層,AbsFactory(抽象工廠))和具體實現的工廠子類。程序員可以根據創建對象類型使用對應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利于代碼的維護和擴展。
  • 我們仍然以上一篇文章的案例為主,畫出抽象工廠模式下的類圖。


    2.案例代碼

    首先仍然是Pizza種類相關的幾個類。

    package com.szh.factory.abstractfactory.pizza;/*** 聲明Pizza類為抽象類*/ public abstract class Pizza {//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;} } package com.szh.factory.abstractfactory.pizza;public class LDPepperPizza extends Pizza {@Overridepublic void prepare() {setName("倫敦的胡椒pizza");System.out.println("倫敦的胡椒pizza 準備原材料");}} package com.szh.factory.abstractfactory.pizza;public class LDCheesePizza extends Pizza {@Overridepublic void prepare() {setName("倫敦的奶酪pizza");System.out.println("倫敦的奶酪pizza 準備原材料");}} package com.szh.factory.abstractfactory.pizza;public class BJPepperPizza extends Pizza {@Overridepublic void prepare() {setName("北京的胡椒pizza");System.out.println("北京的胡椒pizza 準備原材料");}} package com.szh.factory.abstractfactory.pizza;public class BJCheesePizza extends Pizza {@Overridepublic void prepare() {setName("北京的奶酪pizza");System.out.println("北京的奶酪pizza 準備原材料");}}

    下面是抽象工廠和工廠方法的區別之處。

    package com.szh.factory.abstractfactory.order;import com.szh.factory.abstractfactory.pizza.Pizza;//一個抽象工廠模式的抽象層(接口) public interface AbsFactory {//讓下面的工廠子類來具體實現public Pizza createPizza(String orderType); } package com.szh.abstractfactory.order;import com.szh.abstractfactory.pizza.BJCheesePizza; import com.szh.abstractfactory.pizza.BJPepperPizza; import com.szh.abstractfactory.pizza.Pizza;public class BJFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {Pizza pizza = null;if("cheese".equals(orderType)) {pizza = new BJCheesePizza();} else if ("pepper".equals(orderType)){pizza = new BJPepperPizza();}return pizza;} } package com.szh.abstractfactory.order;import com.szh.abstractfactory.pizza.LDCheesePizza; import com.szh.abstractfactory.pizza.LDPepperPizza; import com.szh.abstractfactory.pizza.Pizza;public class LDFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {Pizza pizza = null;if ("cheese".equals(orderType)) {pizza = new LDCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new LDPepperPizza();}return pizza;} } package com.szh.factory.abstractfactory.order;import com.szh.factory.abstractfactory.pizza.Pizza;import java.util.Scanner;public class OrderPizza {AbsFactory absFactory;public OrderPizza(AbsFactory absFactory) {setFactory(absFactory);}private void setFactory(AbsFactory absFactory) {Pizza pizza = null;String orderType = ""; // 用戶輸入this.absFactory = absFactory;do {orderType = getType();// factory 可能是北京的工廠子類,也可能是倫敦的工廠子類pizza = absFactory.createPizza(orderType);if (pizza != null) { // 訂購okpizza.prepare();pizza.bake();pizza.cut();pizza.box();} else {System.out.println("訂購失敗");break;}} while (true);}// 寫一個方法,可以獲取客戶希望訂購的披薩種類private String getType() {Scanner scanner = new Scanner(System.in);System.out.println("請輸入 pizza 種類: ");String str = scanner.nextLine();return str;} }

    最后是測試類。

    package com.szh.abstractfactory;import com.szh.abstractfactory.order.BJFactory; import com.szh.abstractfactory.order.LDFactory; import com.szh.abstractfactory.order.OrderPizza;import java.util.Scanner;public class MainTest {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String content = scanner.next();if ("Beijing".equals(content)) {new OrderPizza(new BJFactory());} else if ("London".equals(content)) {new OrderPizza(new LDFactory());} else {System.out.println("無法預先匹配Pizza種類....");scanner.close();}} }


    3.工廠方法 + 抽象工廠總結

  • 工廠模式的意義:將實例化對象的代碼提取出來,放到一個類中統一管理和維護,達到和主項目的依賴關系的解耦。從而提高項目的擴展和維護性。
  • 遵循了依賴倒轉原則:創建對象實例時,不要直接new類,而是把這個new類的動作放在一個工廠的方法中,并返回。有的書上說,變量不要直接持有具體類的引用。?? 不要讓類繼承具體類,而是繼承抽象類或者是實現interface(接口)不要覆蓋基類中已經實現的方法。
  • 總結

    以上是生活随笔為你收集整理的创建型设计模式——抽象工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。