簡單工廠,工廠方法和抽象工廠模式(我也湊湊熱鬧)

richardluopeng發表於2002-12-20

簡單工廠,工廠方法和抽象工廠模式

作者:羅鵬 Email:luopeng@ec.com.cn

對於簡單工廠來說,它的工廠只能是這個樣子的

public class SimplyFactory {

/**

* 靜態工廠方法

*/

public static Prouct factory(String which) throw NoSuchProductExcption

{

if(which.equalIgnoreCase("product1"))

{

return new Product1();

}

else if(which.equalsIgnoreCase("product2"))

{

return new Product2();

}

else if(which.equalsIgnoreCase("product3"))

{

return new Product3();

}

else throw NoSuchProductExcption("NoSuchProduct");

}

}

}

而對產品Product1,Product2,Product3,可以執行介面Product,也可以不執行介面Product(當然這樣不好),這個Product介面只是用來抽象具體product用的

public interface Product

{

void productMethod1(); //這些只是

void productMethod2();

void productMethod3();

}

對工廠來說,只要有這麼一種產品,一般來說就要在工廠裡有它的生產的方法, 否則丟擲異常,而要工廠生產的話,也必須下達生產什麼產品的命令,至少要向工廠發出訊號,讓工廠足以區分是要生產什麼產品,否則工廠是不知道生產哪一種產品,

對於簡單工廠來說,就是需要在工廠中列舉所有的產品,所以說簡單工廠還是非常笨的。

if(which.equalIgnoreCase("product1")) 只是用來區分生產什麼產品的標記值,(也可以根據產品其它屬性來判斷,比如產品型別,產品大小,總之能夠區分是什麼產品的屬性,或者是與產品屬性相關的變數) 或者說標記值是A,生產A產品,或者工廠裡定義不是這樣的,我偏偏要生產B產品,或者再特殊一些,我偏偏要生產A產品+B產品,那麼就要return new ProductA()+new ProductB()了。

這樣,我們就可以看出一個問題來,如果要能夠被簡單工廠生產出來,就必須在簡單工廠中有能夠生產出的它的方法定義,當然還需要有這個具體產品類的定義,就是有class對應,這樣確保在簡單工廠中new 它的時候不會丟擲 NoSuchProduct的Exception.

對於工廠方法來說

實質上它是讓工廠實現了抽象的工廠介面,它把具體怎麼生產一種東西,放在具體的工廠去實現了,所謂”延遲到子類中實現“

public interface Creator

{

public Prouct factory();

}

public SubCreator1 implent Creator

{

public Prouct factory()

{

return new ConcreteProduct1();

}

}

public SubCreator2 implent Creator

{

public Prouct factory()

{

return new ConcreteProduct2();

}

}

請注意:返回型別是Product型的!!

這樣客戶端呼叫是直接new 一個具體工廠的例項,然後命令它去生產,而對於具體工廠的父類(既工廠介面,介面完全可以改成子類繼承父類來實現,只是這樣不好,不符合OO的原則),它完全不知道什麼產品被生產了,甚至它連那個具體工廠被例項化它都不知道

抽象工廠模式

抽象工廠模式主要是用來解決具體產品是有幾類產品簇的問題

public interface Creator

{

public ProuctA factoryA();

public ProuctB factoryB();

}

public interface ProductA //ProductA 介面

{

}

public interface ProductB //ProductB 介面

{

}

public class ConCreator1 implent Creator

{

public ProuctA factoryA()

{

return new ConcreteProductA1();

}

public ProuctB factoryB()

{

return new ConcreteProductB1();

}

}

public class ConCreator2 implent Creator

{

public ProuctA factoryA()

{

return new ProductA2();

}

public ProuctB factoryB()

{

return new ProductB2();

}

}

public class ProductA1 implements ProductA

{

public ProductA1()

{

}

}

public class ProductA2 implements ProductA

{

public ProductA2()

{

}

}

public class ProductB1 implements ProductB

{

public ProductB1()

{

}

}

public class ProductB2 implements ProductB

{

public ProductB2()

{

}

}

實際上是這樣的

1,兩個工廠類ConCreator1,ConCreator2都實現了Creator介面

2,ProuctA1,ProductA2都實現了ProductA介面

3,ProuctB1,ProductB2都實現了ProductB介面

4,ConCreator1負責生產ProductA型別的產品(包括ProductA1,ProductB1)

5,ConCreator2負責生產ProductB型別的產品(包括ProductA2,ProductB2)

6,工廠方法也有這樣的特徵,也就是說Creator不知道什麼被生產出來,甚至不知道ConCreator1還是ConCreator2被例項化了,因為client高興調那一個工廠,就調那一個工廠,就是說工廠能生產什麼,對客戶端是可見的。甚至還有一種情況,客戶端高興起來就生產了ProductA1,我就不生產ProductA2,因為上面的例子中它們還都是鬆散的,沒有繫結在一起

於是提出另外一個例子,也是老提起的電腦型別的例子

1,電腦生產商是介面,

2,CUP是介面,

3,硬碟是介面,

4,IBM工廠是製造IBM品牌的電腦的工廠

5,DELL工廠是製造DEll品牌的電腦的工廠

為討論方便,就認為電腦=CUP+硬碟;

6,所以呀CUP有IBM的CPU和DELL的CPU

7,同樣硬碟也是有IBM的硬碟和DELL的硬碟

8,IBM工廠生產IBM的CPU和IBM的硬碟,絕對不生產DELL的CPU,也不生產DELL的硬碟

9,同樣DELL工廠也是一樣

public interface 電腦生產商

{

public CPU 製造CPU();

public 硬碟 製造硬碟();

}

public interface CPU

{

}

public interface 硬碟

{

}

public class IBM的CPU implements CPU

{

public IBM的CPU();

}

public class IBM的硬碟 implements 硬碟

{

public IBM的硬碟();

}

public class DELL的CPU implements CPU

{

public DELL的CPU();

}

public class DELL的硬碟 implements 硬碟

{

public DELL的硬碟();

}

//下面是IBM工廠

public class IBM工廠

{

private CPU IBM的CPU私有變數=null;

private 硬碟 IBM的硬碟私有變數=null;

private CPU 製造IBMCPU()

{

return new IBM的CPU();

}

private 硬碟 製造IBM硬碟()

{

return new IBM的CPU();

}

public 電腦 製造IBM電腦()

{

try{

IBM的CPU私有變數=製造IBMCPU();

IBM的硬碟私有變數=製造IBM硬碟();

if(IBM的CPU私有變數!=null&&IBM的硬碟私有變數!=null)

retrun (IBM的CPU私有變數+IBM的硬碟私有變數);

//組裝成IBM電腦

}

catch(Exception e)

{

System.out.println("製造IBM電腦失敗!");

}

}

}

}

這樣,客戶端無法通過命令單生產出一個CPU來,這樣抽象才真正成為一個完整產品的工廠,只要向工廠發出生產的命令,一臺完整的電腦就生產出來了,而工廠怎麼生產的,生產了哪些部件,外界就看不見了,外界就知道這個工廠是生產IBM電腦整機的工廠!

DELL電腦工廠一樣

相關文章