設計模式之工廠模式

  工廠(Factory)模式本質上就是封裝對象的建立編程

  工廠模式大體分爲:簡單工廠靜態工廠工廠方法抽象工廠模式設計模式

  嚴格意義上來講,簡單工廠和靜態工廠並非一種設計模式,反而比較像一種編程習慣。但因爲常常被使用,因此不少開發人員把這個編程習慣認爲是「工廠模式」。ide

 

1.簡單工廠ui

  1.1 簡單工廠角色spa

public class PizzaFactory {
    
    public static final String CHEESE_PIZZA = "Cheese";
    public static final String GREEK_PIZZA = "Greek";
    
    public Pizza createPizza(String type){
        if(CHEESE_PIZZA.equals(type)){
            return new CheesePizza();
        }else if(GREEK_PIZZA.equals(type)){
            return new GreekPizza();
        }
        return null;
    }
}

  1.2 Dome設計

public class PizzaDemo {

    public static void main(String[] args) {
        PizzaFactory factory = new PizzaFactory();
        factory.createPizza(PizzaFactory.CHEESE_PIZZA);
    }
}

 

【每一次建立建立PizzaFactory對象都是爲了調用createPizza(),所以能夠採用靜態方法的方式,減小對PizzaFactory對象的建立。此模式被稱爲靜態工廠模式】3d

 

2. 靜態工廠模式code

  2.1 靜態工廠角色對象

public class PizzaFactory {
    
    public static final String CHEESE_PIZZA = "Cheese";
    public static final String GREEK_PIZZA = "Greek";
    
    public static Pizza createPizza(String type){
        if(CHEESE_PIZZA.equals(type)){
            return new CheesePizza();
        }else if(GREEK_PIZZA.equals(type)){
            return new GreekPizza();
        }
        return null;
    }
}

  2.2 Demoblog

public class PizzaDemo {

    public static void main(String[] args) {
        PizzaFactory.createPizza(PizzaFactory.CHEESE_PIZZA);
    }
}

 

【每添加一種新的品種,都須要對工廠類進行修改,這違背了設計模式中的開放-封閉原則(對擴展開放,對修改封閉),所以有了工廠方法】

 

3. 工廠方法

  針對一個產品,經過繼承的方式,讓子類建立對象。若是須要添加新的品種,只須要建立新的子類。

  3.1 超類

public abstract class PizzaStore {

    public abstract Pizza createPizza();
    
    public Pizza orderPizza(){
        // let sub-class decide to which pizza will be created.
        Pizza pizza = createPizza();
        pizza.make();
        pizza.bake();
        pizza.cut();   
        pizza.box();
        return pizza;
    }
    
}

  3.2 子類

public class CheesePizzaStore extends PizzaStore {
    
    @Override
    public Pizza createPizza(){
        return new CheesePizza();
    }

}

  3.3 Demo

public class PizzaDemo {

    public static void main(String[] args) {
        PizzaStore store = new CheesePizzaStore();
        store.orderPizza();
    }
}

 

【當須要建立多個產品(即:產品族)的時候,工廠方法已經沒法知足需求。針對這種狀況,產生了抽象工廠模式】

 

4. 抽象工廠模式

  抽象工廠針對的是一個產品族,經過組合的方式建立對象。

  4.1 抽象工廠角色【聲明產品】

//Two product: Apple & Banana

public
interface FruitFactory { public Fruit getApple(); public Fruit getBanana(); }

  4.2 具體的工廠角色【實例化某個產品族族中的全部產品】

public class NorthFruitFactory implements FruitFactory {

    @Override
    public Fruit getApple() {
        return new NorthApple();
    }

    @Override
    public Fruit getBanana() {
        return new NorthBanana();
    }

}
public class SouthFruitFactory implements FruitFactory {

    @Override
    public Fruit getApple() {
        return new SouthApple();
    }

    @Override
    public Fruit getBanana() {
        return new SouthBanana();
    }

}

  4.3 Dome

public class Demo {

    public static void main(String[] args) {
        FruitFactory factory = new NorthFruitFactory();
        factory.getApple();
        factory.getBanana();
        
        System.out.println("---------------------------");
        
        factory = new SouthFruitFactory();
        factory.getApple();
        factory.getBanana();
    }
}

   4.4 備註

        當須要添加一個新的產品,就必須修改接口,而且須要修改每一個接口的實現

 

5.參考資料

  5.1 O'Reilly《Head First設計模式》

  5.2 北風網在線培訓《策略模式》

相關文章
相關標籤/搜索