2.3 抽象工廠模式
定義:
Provide an interface for creating famillies of related or dependent objects without specifying their concreate classes.
為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口躬厌,而且無(wú)須指定它們的具體類亮瓷。
優(yōu)點(diǎn):
- 封裝性,每個(gè)產(chǎn)品的實(shí)現(xiàn)類不是高層模塊要關(guān)心的
- 產(chǎn)品族內(nèi)的約束為非公開狀態(tài)渣淳。ex:生產(chǎn)左右車門的比例
缺點(diǎn):
- 產(chǎn)品族擴(kuò)展非常困難征唬。ex:增加產(chǎn)品C礁扮,抽象工廠AbstractCreator 要增加 createProductC()忿偷,具體工廠Creator1和Creator2 都需要修改蛉威。
ex:違反了開閉原則材蛛。抽象類和接口是一個(gè)契約圆到,改變契約,所有與契約有關(guān)的代碼都要改卑吭。
使用場(chǎng)景:
一個(gè)對(duì)象(或者是一組沒有任何關(guān)系的對(duì)象)都有相同的約束芽淡,則可以使用工廠模式。
ex:文本編輯器和圖片查看器豆赏,在linux和windows上功能相同挣菲,代碼實(shí)現(xiàn)不同。
兩者的共同約束:操作系統(tǒng)類型掷邦。
可以采用抽象工廠模式產(chǎn)生不同操作系統(tǒng)下的軟件白胀。
注意:
產(chǎn)品等級(jí)的擴(kuò)展容易:增加一個(gè)產(chǎn)品等級(jí),只要增加一個(gè)工廠負(fù)責(zé)新任務(wù)即可抚岗,符合開閉原則或杠。
總結(jié):
產(chǎn)品層級(jí)-產(chǎn)品等級(jí):縱向,車型號(hào)宣蔚,人膚色向抢。難擴(kuò)展
產(chǎn)品種類-產(chǎn)品族:橫向认境,車門,人性別挟鸠。易擴(kuò)展
代碼:
/**
* *************************抽象產(chǎn)品類***********************
*/
abstract class AbstractProductA{
//每個(gè)產(chǎn)品的共有方法
public void shareMethod(){}
//每個(gè)產(chǎn)品相同方法叉信,不同實(shí)現(xiàn)
public abstract void doSomething();
}
abstract class AbstractProductB{
public void shareMethod(){}
public abstract void doSomething();
}
/**
* *************************具體產(chǎn)品類***********************
*/
class ProductA1 extends AbstractProductA{
public void doSomething(){System.out.println("產(chǎn)品A1的實(shí)現(xiàn)方法");}
}
class ProductA2 extends AbstractProductA{
public void doSomething(){System.out.println("產(chǎn)品A2的實(shí)現(xiàn)方法");}
}
class ProductB1 extends AbstractProductB{
public void doSomething(){System.out.println("產(chǎn)品B1的實(shí)現(xiàn)方法");}
}
class ProductB2 extends AbstractProductB{
public void doSomething(){System.out.println("產(chǎn)品B2的實(shí)現(xiàn)方法");}
}
/**
* *************************抽象創(chuàng)建者***********************
*/
abstract class AbstractCreator{
//有多少產(chǎn)品族(車型號(hào)),建多少個(gè)創(chuàng)建方法
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProuctB();
}
/**
* *************************具體創(chuàng)建者***********************
*
* 有多少產(chǎn)品等級(jí)(左右門)艘希,建多少創(chuàng)建者
*/
class Creator1 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProuctB() {
return new ProductB1();
}
}
class Creator2 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProuctB() {
return new ProductB2();
}
}
/**
* *************************場(chǎng)景類***********************
* 場(chǎng)景類中的方法與具體實(shí)現(xiàn)類沒有關(guān)系
* 場(chǎng)景類只需要知道一個(gè)產(chǎn)品的工廠方法就可以直接生產(chǎn)一個(gè)產(chǎn)品茉盏,無(wú)需關(guān)心具體實(shí)現(xiàn)
*/
class Client{
public static void main(String[] args){
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
AbstractProductA a1 = creator1.createProductA();
AbstractProductB b1 = creator1.createProuctB();
AbstractProductA a2 = creator2.createProductA();
AbstractProductB b2 = creator2.createProuctB();
}
}