設計模式之二:工廠方法模式

定義
工廠方法模式又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠模式(Polymorphic Factory),在工廠方法模式中,父類負責定義創建對象的公共接口,而子類則負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成,即由子類來決定究竟應該實例化(創建)哪一個類。
工廠方式法模式(Factory Method),定義了一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到子類。

意圖
定義一個用戶創建對象的接口,讓子類決定實例化哪一個類,工廠方法模式使一個類的實例化延遲到其子類。

參與者
抽象產品角色(Product):定義產品的接口
具體產品角色(ConcreteProduct) :實現接口Product的具體產品類
抽象工廠角色(Creator) :聲明工廠方法(FactoryMethod),返回一個產品
真實的工廠(ConcreteCreator):實現FactoryMethod工廠方法,由客戶調用,返回一個產品的實例

工廠方法模式又稱爲工廠模式,它屬於類創建型模式。在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。


工廠方法模式的主要優點是增加新的產品類時無須修改現有系統,並封裝了產品對象的創建細節,系統具有良好的靈活性和可擴展性;其缺點在於增加新產品的同時需要增加新的工廠,導致系統類的個數成對增加,在一定程度上增加了系統的複雜性。 
工廠方法模式適用情況包括:一個類不知道它所需要的對象的類;一個類通過其子類來指定創建哪個對象;將創建對象的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類創建產品子類,需要時再動態指定。

 

package com.xjh.demo.designpattern.pattern2;

public abstract class Animal {
    public abstract void eat();
}

package com.xjh.demo.designpattern.pattern2;

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("cat eat fish!! ");
    }
}
package com.xjh.demo.designpattern.pattern2;

public class Dog extends Animal {

    public void eat() {
        System.out.println("dog eat meat!!");
    }
}
package com.xjh.demo.designpattern.pattern2;

public interface AnimalFactory {
    public abstract Animal createAnimal();
}
package com.xjh.demo.designpattern.pattern2;

public class CatFactory implements AnimalFactory{
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}

 

package com.xjh.demo.designpattern.pattern2;

public class DogFactory implements AnimalFactory{
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

 

package com.xjh.demo.designpattern.pattern2;

public class AnimalTest {
    public static void main(String[] args) {
        AnimalFactory animalFactory = new DogFactory();
        Animal animal = animalFactory.createAnimal();
        animal.eat();
        animalFactory = new CatFactory();
        animal = animalFactory.createAnimal();
        animal.eat();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章