定義
工廠方法模式又稱爲工廠模式,也叫虛擬構造器(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(); } }