当前位置: 首页>编程笔记>正文

如何創建一個抽象類,創建具體的產品,并繼承產品抽象類

如何創建一個抽象類,創建具體的產品,并繼承產品抽象類

工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。

PS:在設計模式中,“實現一個接口”泛指實現某個超類型(可以是類或接口)的某個方法。

要點:

  • 通過子類來創建具體的對象。客戶只需要知道他們所使用的抽象類型即可。
  • 由子類決定要實例化的類是哪一個,是指在編寫創建者類時,不需要知道實際創建的產品是哪一個。選擇了使用哪個創建者子類,自然就決定了實際創建的產品是什么。
  • 對象統一由定義好的工廠方法來創建。

二、實現步驟

1、創建產品抽象類

/*** 產品抽象類*/
public abstract class Product {String name;public String getName() {return name;}
}

2、創建具體的產品,并繼承產品抽象類

(1)產品A1

/*** 產品A1*/
public class ConcreteProductA1 extends Product {public ConcreteProductA1() {name = "ConcreteProductA1";}
}

如何創建一個抽象類、(2)產品A2

/*** 產品A2*/
public class ConcreteProductA2 extends Product {public ConcreteProductA2() {name = "ConcreteProductA2";}
}

(3)產品B1

/*** 產品B1*/
public class ConcreteProductB1 extends Product {public ConcreteProductB1() {name = "ConcreteProductB1";}
}

(4)產品B2

/*** 產品B2*/
public class ConcreteProductB2 extends Product {public ConcreteProductB2() {name = "ConcreteProductB2";}
}

3、創建創建者抽象類,并定義用來創建產品的工廠方法

創建者一般為需要用到產品的類,需要的產品則通過類中的工廠方法創建。

/*** 創建者抽象類*/
public abstract class Creator {/*** 創建產品(工廠方法)*/protected abstract Product createProduct(String productType);
}

4、創建具體的創建者,并繼承創建者抽象類

具體的創建者需要實現創建產品的工廠方法。

繼承抽象類必須實現所有方法嗎、(1)創建者1

/*** 創建者1*/
public class ConcreteCreator1 extends Creator {@Overrideprotected Product createProduct(String productType) {// 由具體的創建者(子類)決定創建哪個類的對象if ("A".equals(productType)) {return new ConcreteProductA1();} else if ("B".equals(productType)) {return new ConcreteProductB1();}return null;}
}

(2)創建者2

/*** 創建者2*/
public class ConcreteCreator2 extends Creator {@Overrideprotected Product createProduct(String productType) {// 由具體的創建者(子類)決定創建哪個類的對象if ("A".equals(productType)) {return new ConcreteProductA2();} else if ("B".equals(productType)) {return new ConcreteProductB2();}return null;}
}

5、創建者通過工廠方法創建產品

public class Test {public static void main(String[] args) {// 創建者1Creator creator1 = new ConcreteCreator1();// 創建者2Creator creator2 = new ConcreteCreator2();// 通過工廠方法創建產品Product product = creator1.createProduct("A");System.out.println("創建者1創建產品A:" + product.getName());product = creator2.createProduct("A");System.out.println("創建者2創建產品A:" + product.getName());}
}

三、舉個栗子

1、背景

假設你有一個披薩店,出售多種類型的披薩:芝士披薩、蛤蜊披薩、素食披薩等。由于經營有成,你打算推廣自己的加盟店。

為了確保加盟店運營的質量,你希望加盟店能夠采用固定的制作流程。但是由于區域的差異,每家加盟店都可能想要提供不同風味的披薩(比如紐約、芝加哥、加州),因此又必須允許加盟店能夠自由地制作該區域的風味。

2、實現

披薩店子類通過實現創建披薩方法來決定要創建什么風味的披薩。

抽象類有沒有構造方法?(1)創建披薩抽象類

/*** 披薩抽象類*/
public abstract class Pizza {/*** 名稱*/String name;/*** 面團*/String dough;/*** 醬料*/String sauce;/*** 佐料*/ArrayList<String> toppings = new ArrayList<>();void prepare() {System.out.println("Preparing " + name);System.out.println("Tossing dough...");System.out.println("Adding souce...");System.out.println("Adding toppings: ");for (int i = 0; i < toppings.size(); i++) {System.out.println(" "+ toppings.get(i));}}/*** 烘烤*/void bake() {System.out.println("Bake for 25 minutes at 350");}/*** 切片*/void cut() {System.out.println("Cutting the pizza into diagonal slices");}/*** 裝盒*/void box() {System.out.println("Place pizza in official PizzaStore box");}public String getName() {return name;}
}

(2)創建不同風味、不同類型的披薩

/*** 紐約風味的芝士披薩*/
public class NYStyleCheesePizza extends Pizza {public NYStyleCheesePizza() {name = "NY Style Sauce and Cheese Pizza";dough = "Thin Crust Dough";sauce = "Marinara Sauce";toppings.add("Grated Reggiano Cheese");}
}
/*** 紐約風味的蛤蜊披薩*/
public class NYStyleClamPizza extends Pizza {public NYStyleClamPizza() {name = "NY Style Sauce Clam Pizza";dough = "Thin Crust Dough";sauce = "Marinara Sauce";toppings.add("Fresh Clams");}
}
/*** 芝加哥風味的芝士披薩*/
public class ChicagoStyleCheesePizza extends Pizza {public ChicagoStyleCheesePizza() {name = "Chicago Style Deep Dish Cheese Pizza";dough = "Extra Thick Crust Dough";sauce = "Plum Tomato Sauce";toppings.add("Shredded Mozzarella Cheese");}void cut() {System.out.println("Cutting the pizza into square slices");}
}
/*** 芝加哥風味的蛤蜊披薩*/
public class ChicagoStyleClamPizza extends Pizza {public ChicagoStyleClamPizza() {name = "Chicago Style Clam Pizza";dough = "Extra Thick Crust Dough";sauce = "Plum Tomato Sauce";toppings.add("Frozen Clams");}void cut() {System.out.println("Cutting the pizza into square slices");}
}

(3)創建披薩店抽象類

/*** 披薩店抽象類*/
public abstract www.xingyunylpt.com class PizzaStore {/*** 訂購披薩*/public Pizza www.youy2zhuce.cn orderPizza(String type) {Pizza pizza www.jujinyule.com= createPizza(type);pizza.prepare( www.shentuylgw.cn);pizza.bake(www.lanboyulezc.cn);pizza.cut( www.tengyao3zc.cn);pizza.box(www.uuedzc.cn);return pizza;}/*** 創建披薩(工廠方法)*/protected abstract Pizza createPizza(String type);
}

(4)創建不同風味的披薩店

/*** 紐約風味披薩店*/
public class NYStylePizzaStore extends     protected Pizza createPizza(String type) {Pizza pizza = null;if ("cheese".equals(type)) {pizza = new NYStyleCheesePizza(); } else if ("clam".equals(type)) {pizza = new NYStyleClamPizza();}return pizza;}
}
/*** 芝加哥風味披薩店*/
public class ChicagoStylePizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {Pizza pizza lexuancaizc.cn= null;if (www.chuancenpt.com"cheese".equals(type)) {pizza = new ChicagoStyleCheesePizza(www.yuntianyul.com ); } else if ( www.jintianxuesha.com"clam".equals(type)) {pizza = new ChicagoStyleClamPizza();}return pizza;}
}

(5)使用不同風味的披薩店訂購披薩

public class Test {public static void main(String[] args) {// 紐約風味披薩店PizzaStore nyStore = new NYStylePizzaStore();// 芝加哥風味披薩店PizzaStore chicagoStore = new ChicagoStylePizzaStore();// 訂購芝士披薩Pizza pizza = nyStore.orderPizza("cheese");System.out.println("Ethan ordered a " + pizza.getName() + "\n");pizza = chicagoStore.orderPizza("cheese");System.out.println("Joel ordered a " + pizza.getName() + "\n");

https://www.nshth.com/bcbj/338904.html
>

相关文章:

  • 如何創建一個抽象類
  • 繼承抽象類必須實現所有方法嗎
  • 抽象類有沒有構造方法
  • 不能用抽象類去創建對象
  • java抽象類可以被繼承嗎
  • 抽象類不能繼承其他類
  • 抽象類是否可繼承具體類
  • Java可以基于抽象類創建對象
  • pdf翻譯網站,1 Trillion Dollar Refund – How To Spoof PDF Signatures——欺騙PDF簽名
  • 如何創建一個抽象類,創建具體的產品,并繼承產品抽象類
  • 主從庫理論知識-主從同步如何實現?
  • Tomcat環境變量配置,Mybatis的配置文件參數詳解
  • I Am You,POJ 3130 How I Mathematician Wonder What You Are! 半平面交
  • 要學vue需要學什么基礎知識,第一章 Vue基礎入門
  • win7下安裝win10,win10下安裝Ubuntu18.10雙系統
  • vmplayer怎么使用烏邦圖,烏邦圖環境安裝
  • 計算機專業要不要考研——寫的很棒
  • redisson看門狗原理,記錄一次redis漏洞攻擊
  • 任意波形發生器,基于單片機信號波形發生器系統設計-畢設課設
  • 嵌入式驅動,嵌入式Linux驅動大全問世,十年磨一劍,視頻!服務!新老客戶都有大折扣!
  • socket連接器v2下載,Netty(一)基礎socketchannel,Buffer,selector黏包 半包解決 實戰
  • 大一c語言程序設計筆記,吉林大學2013級大一下學期程序設計作業:同學通訊錄系統
  • 暑期小學生計算機培訓班,青島小學生學習編程暑假
  • 熊貓毛小喵喵去哪里了,小西貝、何小喵看熊貓之觀察者設計模式
  • 如何用c語言比較兩個數的大小,如何用C語言求兩個數的較大值
  • 輾轉相除法求最小公倍數的方法,更相減損術--最大公約數
  • 輾轉相除法求最小公倍數的方法,如何求出兩個整數的最大公約數
  • 李新義的書畫藝術,中國現代書畫家——譚奇中、李義象、高俊鵬等
  • 海底撈張勇名言,致張勇先生一封信:海底撈的“七宗罪”!
  • WPF學習(12)動畫
  • ui自動化測試工具,移動端UI自動化之appium的使用(二)
  • 爬蟲網站,Search For Free —— 新聞爬蟲及爬取結果的查詢網站
  • tenda騰達無線設置,騰達F6路由器無線中繼功能設置
  • 斐波那契數列、小青蛙跳臺階
  • OJ每日一練——小青蛙上臺階
  • 小青蛙貝葉斯
  • 小青蛙走臺階問題
  • MySQL數據庫下載,NAVICAT FOR MYSQL存儲過程