文章目錄
- 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.引出工廠模式
具體需求
2.傳統模式
1.類圖
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.優缺點分析
3.簡單工廠模式
1.基本介紹
2.類圖
3.目錄結構
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.具體需求引入工廠方法模式
2.基本介紹
3.類圖
4.目錄結構
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.基本介紹
2.類圖
3.目錄結構
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());}
}