1. 程式人生 > 其它 >學習筆記【23種設計模式-第三節:工廠模式--簡單工廠、工廠方法、抽象工廠】

學習筆記【23種設計模式-第三節:工廠模式--簡單工廠、工廠方法、抽象工廠】

技術標籤:# 23種設計模式設計模式java抽象類

工廠模式

簡單工廠模式

簡述:

  • 簡單工廠模式屬於建立型模式,是工廠模式的一種,簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式。
  • 簡單工廠模式:定義一個建立物件的類,有這個類來封裝例項化物件的行為。
  • 在軟體開發中,當我們會用到大量的建立某種、某類或者某物件時,就會使用到工廠模式。

Pizza類:

public abstract class PizzaTest {
    protected String name;
    public abstract void prepare()
; public void bake(){ System.out.println(name+" breaking;"); } public void cut(){ System.out.println(name+" cutting!"); } public void box(){ System.out.println(name+" boxing!"); } public void setName(String name) { this
.name = name; } }

CheesePizza類

public class CheesePizza extends PizzaTest {
    @Override
    public void prepare() {
        System.out.println("給製作乳酪pizza準備材料!");
    }
}

GreekPizza類

public class GreekPizza extends PizzaTest {
    @Override
    public void prepare() {
        System.
out.println("給製作希臘pizza準備材料!"); } }

OrderPizza類:

public class OrderPizza {
    public OrderPizza(SimpleFactory simpleFactory) {
        setFactory(simpleFactory);
    }

    SimpleFactory simpleFactory;
    PizzaTest pizzaTest;
    public void setFactory(SimpleFactory simpleFactory){
        this.simpleFactory=simpleFactory;
        String orderType="";
        do {
            orderType=getType();
            pizzaTest=this.simpleFactory.creatPizza(orderType);
            if (pizzaTest!=null){
                pizzaTest.prepare();
                pizzaTest.bake();
                pizzaTest.cut();
                pizzaTest.box();
            }else{
                System.out.println("訂購失敗!");
                break;
            }
        }while (true);
    }

    private String getType(){
        Scanner s=new Scanner(System.in);
        System.out.println("Please Input Pizza Type:");
        String str=s.next();
        return str;
    }

}

SimpleFactory類:

public class SimpleFactory {
    public PizzaTest creatPizza(String orderType){
        PizzaTest pizza=null;
        System.out.println("使用簡單工廠模式");
        if (orderType.equals("greek")){
            pizza=new GreekPizza();
            pizza.setName("希臘披薩!");
        }else if(orderType.equals("cheese")) {
            pizza = new GreekPizza();
            pizza.setName("乳酪披薩!");
        }
        return pizza;
    }
}

主程式

public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza(new SimpleFactory());
        System.out.println("---退出程式---");
    }
}

簡單工廠模式又叫靜態工廠模式

將簡單工廠的方法設為靜態的。

改進:
SimpleFactory類:

public class SimpleFactory {
    public static PizzaTest creatPizza(String orderType){
        PizzaTest pizza=null;
        System.out.println("使用簡單工廠模式");
        if (orderType.equals("greek")){
            pizza=new GreekPizza();
            pizza.setName("希臘披薩!");
        }else if(orderType.equals("cheese")) {
            pizza = new GreekPizza();
            pizza.setName("乳酪披薩!");
        }
        return pizza;
    }
}

OrderPizza類:

public class OrderPizza {
    PizzaTest pizzaTest=null;
    String orderType="";
    public OrderPizza() {
        do {
            orderType=getType();
            pizzaTest=SimpleFactory.creatPizza(orderType);
            if (pizzaTest!=null){
                pizzaTest.prepare();
                pizzaTest.bake();
                pizzaTest.cut();
                pizzaTest.box();
            }else{
                System.out.println("訂購失敗!");
                break;
            }
        }while (true);
    }

    private String getType(){
        Scanner s=new Scanner(System.in);
        System.out.println("Please Input Pizza Type:");
        String str=s.next();
        return str;
    }
}

工廠方法模式

  • 披薩專案有了新的需求,可以點不同地方口味的,比如北京的乳酪披薩,倫敦的乳酪披薩等。
  • 使用簡單工廠模式,建立不同的簡單工廠類,比如北京的簡單工廠、倫敦的簡單工廠,但考慮到專案規模,軟體的可維護性個可擴充套件性不是特別好。
  • 使用工廠方法模式。

簡述:

  • 工廠方法模式設計方案: 將劈殺專案的例項化功能抽象成抽象方法,在不同地方的口味點餐子類種具體實現。
  • 工廠方法模式: 定義了一個建立物件的抽象方法,由子類決定要例項化的類。工廠方法模式將物件的例項化推遲到了子類。

例子:有BJCheesePizza,BJPepperPizza,LDCheesePizza,LDPepperPizza四個類,繼承Pizza類,有一個OrderPizza抽象類,BJOrderPizza和LDOrderPizza類繼承OrderPizza。

OrderPizza抽象類:

public abstract class OrderPizza {
    abstract Pizza createPizza(String orderType);

    public OrderPizza(){
        Pizza pizza=null;
        String orderType;
        do {
            orderType=getType();
            pizza=createPizza(orderType);
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while (true);

    }
    private String getType(){
        Scanner s=new Scanner(System.in);
        System.out.println("Please Input Pizza Type:");
        String str=s.next();
        return str;
    }
}

BJOrderPizza類:

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;
    }
}

LDOrderPizza類:

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;
    }
}

抽象工廠模式

簡述:

  • 抽象工廠模式:定義了一個interface用於建立相關或有依賴關係的物件簇,而無需指明具體的類。
  • 抽象工廠模式可以將簡單工廠模式和工廠方法模式進行整合。
  • 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者稱為進一步抽象)。
  • 將工廠抽象層兩層,AbsFactory(抽象工廠)和具體實現的工廠子類。程式設計師根據建立物件型別使用相應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利於程式碼的維護和擴充套件。

例子:Pizza和前面是一樣的,多定義了一個介面ABSFactory,裡面有一個createPizza()方法,BJFactory及LDFactory類實現了該介面,在裡面new物件,和前面的大同小異,OrderPizza類中傳入了ABSFactory介面(聚合,傳入構造器)。

OrderPizza類:

public class OrderPizza {
    ABSFactory absFactory;

    public OrderPizza(ABSFactory absFactory) {
        setAbsFactory(absFactory);
    }

    private void setAbsFactory(ABSFactory absFactory) {
        this.absFactory=absFactory;
        Pizza pizza=null;
        String orderType="";
        do {
            orderType=getType();
            pizza= absFactory.creatPizza(orderType);
            if (pizza!=null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else{
                System.out.println("訂購失敗!");
                break;
            }
        }while (true);

    }
    private String getType(){
        Scanner s=new Scanner(System.in);
        System.out.println("Please Input Pizza Type:");
        String str=s.next();
        return str;
    }
}

小結:

① 工廠模式的意義:將例項化物件的程式碼提取出來,放到一個類中統一管理和維護,達到和主專案的依賴關係的解耦。從而提高專案的擴充套件和維護性。

② 三種工廠模式(簡單工廠模式、工廠方法模式、抽象工廠模式)

③ 設計模式的依賴抽象原則

  • 建立物件例項時,不要直接new類,而是把這個new類的動作放在一個工廠的方法中,並返回,有的書上說,變數不要直接持有具體類的引用。
  • 不要讓類繼承具體類,而是繼承抽象類或者是實現介面。
  • 不要覆蓋基類中已經實現的方法。

工廠模式在JDK中的Calendar類中就運用到了。

上一篇:學習筆記【23種設計模式-第二節:Singleton單例模式】