工廠方法模式基本介紹工廠方法模式設(shè)計方案:將披薩項目的實例化功能抽象成抽象方法,在不同的口味點餐子類中具體實現(xiàn)。 工廠方法模式:定義了一個創(chuàng)建對象的抽象方法,由子類決定要實例化的類。工廠方法模式將對象的實例化推遲到子類。 應(yīng)用案例披薩項目新的需求:客戶在點披薩時,可以點不同口味的披薩,比如?北京的奶酪pizza、北京的胡椒pizza?或者是倫敦的奶酪pizza、倫敦的胡椒pizza 思路1使用簡單工廠模式,創(chuàng)建不同的簡單工廠類,比如?BJPizzaSimpleFactory、LDPizzaSimpleFactory?等等。從當前這個案例來說,也是可以的,但是考慮到項目的規(guī)模,以及軟件的可維護性、可擴展性并不是特別好。 思路2使用工廠方法模式 思路分析圖解
? 代碼演示
Pizza:所有披薩類的基類,抽象類 BJCheesePizza:北京奶酪披薩 BJPepperPizza:北京胡椒披薩 LDCheesePizza:倫敦奶酪披薩 LDPepperPizza:倫敦胡椒披薩
package com.atguigu.factory.factorymethod.pizzastore.pizza;
/**
* 將披薩類做成抽象類
*/
public abstract class Pizza {
protected String name; // 披薩的名字
// 準備原材料,不同的披薩是不一樣的,因此,做成抽象方法讓子類來實現(xiàn)
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;
}
}
Pizza
package com.atguigu.factory.factorymethod.pizzastore.pizza;
public class BJCheesePizza extends Pizza {
@Override
public void prepare() {
setName("北京奶酪披薩");
System.out.println("北京奶酪披薩 準備原料");
}
}
BJCheesePizza
package com.atguigu.factory.factorymethod.pizzastore.pizza;
public class BJPepperPizza extends Pizza {
@Override
public void prepare() {
setName("北京胡椒披薩");
System.out.println("北京胡椒披薩 準備原料");
}
}
BJPepperPizza
package com.atguigu.factory.factorymethod.pizzastore.pizza;
public class LDCheesePizza extends Pizza {
@Override
public void prepare() {
setName("倫敦奶酪披薩");
System.out.println("倫敦奶酪披薩 準備原料");
}
}
LDCheesePizza
package com.atguigu.factory.factorymethod.pizzastore.pizza;
public class LDPepperPizza extends Pizza {
@Override
public void prepare() {
setName("倫敦胡椒披薩");
System.out.println("倫敦胡椒披薩 準備原料");
}
}
LDPepperPizza
? OrderPizza:訂購披薩的抽象類
package com.atguigu.factory.factorymethod.pizzastore.order;
import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public abstract class OrderPizza {
// 定義一個抽象方法, createPizza ,讓各個工廠子類自己實現(xiàn)
abstract Pizza createPizza(String orderType);
// 構(gòu)造器
public OrderPizza() {
Pizza pizza = null;
String orderType; // 訂購披薩的類型
do {
orderType = getType();
pizza = createPizza(orderType); // 抽象方法,由工廠子類完成
// 輸出 pizza 制作過程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
// 寫一個方法,可以獲取客戶希望訂購的披薩種類
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
OrderPizza
package com.atguigu.factory.factorymethod.pizzastore.order;
import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza;
import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza;
import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;
public class BJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")){
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")){
pizza = new BJPepperPizza();
}
return pizza;
}
}
BJOrderPizza
package com.atguigu.factory.factorymethod.pizzastore.order;
import com.atguigu.factory.factorymethod.pizzastore.pizza.*;
/**
* 倫敦訂購披薩
*/
public class LDOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")){
pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")){
pizza = new LDPepperPizza();
}
return pizza;
}
}
LDOrderPizza
package com.atguigu.factory.factorymethod.pizzastore.order;
/**
* 測試類
*/
public class PizzaStore {
public static void main(String[] args) {
String loc = "bj";
if (loc.equals("bj")){
// 創(chuàng)建北京的口味的各種Pizza
new BJOrderPizza();
}else {
// 創(chuàng)建倫敦的口味的各種Pizza
new LDOrderPizza();
}
}
}
PizzaStore
? 來源:https://www./content-4-354001.html |
|
|