設計模式04_抽象原廠模式,設計模式04抽象工廠
本文是在學習中的總結,歡迎轉載但請註明出處:http://blog.csdn.net/pistolove/article/details/46440915
抽象原廠模式是對象的建立模式,它是Factory 方法模式的進一步推廣。
抽象原廠模式與Factory 方法模式的最大區別就在於Factory 方法模式針對的是一個產品等級結構;而抽象原廠模式則需要面對多個產品等級結構。
假設一個子系統需要一些產品對象,而這些產品又屬於一個以上的產品等級結構。那麼為了將消費這些產品對象的責任和建立這些產品對象的責任分割開來,可以引進抽象原廠模式。這樣的話,消費產品的一方不需要直接參与產品的建立工作,而只需要向一個公用的工廠介面請求所需要的產品。
優點:
(1)分離介面和實現
用戶端使用抽象工廠來建立需要的對象,而用戶端根本就不知道具體的實現是誰,用戶端只是面向產品的介面編程而已。也就是說,用戶端從具體的產品實現中解耦。
(2)使切換產品族變得容易
因為一個具體的工廠實現代表的是一個產品族,比如上面例子的從A產品到B產品只需要切換一下具體工廠。
缺點:
(1)不太容易擴充新的產品
如果需要給整個產品族添加一個新的產品,那麼就需要修改抽象工廠,這樣就會導致修改所有的工廠實作類別。
通過下面代碼來熟悉抽象原廠模式:
不同的抽象工廠:
package com.design.abstractFactory;//每一種牌子的產品負責生產工廠,即不同的廠商負責自己牌子的生產public abstract class Factory1 {abstract public IproductA getproductA1();abstract public IproductB getProductB1();}
package com.design.abstractFactory;public abstract class Factory2 {abstract public IproductA getproductA2();abstract public IproductB getproductB2();}
不同的具體工廠:
package com.design.abstractFactory;//具體的工廠生產產品public class ConcreateFactory1 extends Factory1 {@Overridepublic IproductA getproductA1() {return new ProductA1();}@Overridepublic IproductB getProductB1() {return new ProductB1();}}
package com.design.abstractFactory;public class ConcreateFactory2 extends Factory2{@Overridepublic IproductA getproductA2() {return new ProductA2();}@Overridepublic IproductB getproductB2() {return new ProductB2();}}
定義不同的產品介面:
package com.design.abstractFactory;//定義不同的產品之間的一定具備的標準,用interface實現 public interface IproductA {public void method();}
package com.design.abstractFactory;public interface IproductB {public void method();}
不同的具體產品:
package com.design.abstractFactory;//實現了產品標準實現的一系列具體產品public class ProductA1 implements IproductA {@Overridepublic void method() {System.err.println("A1產品生產A1");}}
package com.design.abstractFactory;public class ProductA2 implements IproductA {@Overridepublic void method() {System.err.println("A2生產產品A2");}}
package com.design.abstractFactory;public class ProductB1 implements IproductB {@Overridepublic void method() {System.err.println("B1生產產品B1");}}
package com.design.abstractFactory;public class ProductB2 implements IproductB {@Overridepublic void method() {System.err.println("B2生產產品B2");}}
用戶端實現:
package com.design.abstractFactory;public class Client {public static void main(String[] args) {Factory1 factory = new ConcreateFactory1();IproductA a1 = factory.getproductA1();IproductB b1 = factory.getProductB1();a1.method();b1.method();}}
測試結果:
A1產品生產A1
B1生產產品B1