我們一起聊聊抽象工廠模式(AbstractFactoty)
今天給大家介紹《Java極簡設(shè)計模式》的第02章,抽象工廠模式(AbstractFactoty),多一句沒有,少一句不行,用最簡短的篇幅講述設(shè)計模式最核心的知識,好了,開始今天的內(nèi)容。
一、概述
提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。
二、為何使用
工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統(tǒng)可以說是隨處可見。
為什么工廠模式是如此常用?因?yàn)楣S模式就相當(dāng)于創(chuàng)建實(shí)例對象的new,我們經(jīng)常要根據(jù)類Class生成實(shí)例對象,如A a=new A() 工廠模式也是用來創(chuàng)建實(shí)例對象的,所以以后new時就要多個心眼,是否可以考慮實(shí)用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統(tǒng)帶來更大的可擴(kuò)展性和盡量少的修改量。
三、實(shí)用性
- 一個系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時。
- 一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。
- 當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進(jìn)行聯(lián)合使用時。
- 當(dāng)你提供一個產(chǎn)品類庫,而只想顯示它們的接口而不是實(shí)現(xiàn)時。
四、參與者
- AbstractFactory 聲明一個創(chuàng)建抽象產(chǎn)品對象的操作接口。
- ConcreteFactory 實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作。
- AbstractProduct 為一類產(chǎn)品對象聲明一個接口。
- ConcreteProduct 定義一個將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對象。實(shí)現(xiàn)AbstractProduct接口。
- Client 僅使用由AbstractFactory和AbstractProduct類聲明的接口
五、類圖
圖片
六、示例
- AbstractFactory
定義抽象工程類IAnimalFactory
public interface IAnimalFactory {
/**
* 定義創(chuàng)建Icat接口實(shí)例的方法
* @return
*/
ICat createCat();
/**
* 定義創(chuàng)建IDog接口實(shí)例的方法
* @return
*/
IDog createDog();
}
- ConcreteFactory
創(chuàng)建抽象工廠類的兩個實(shí)現(xiàn)類,WhiteAnimalFactory和BlackAnimalFactory
public class WhiteAnimalFactory implements IAnimalFactory {
public ICat createCat() {
return new WhiteCat();
}
public IDog createDog() {
return new WhiteDog();
}
}
public class BlackAnimalFactory implements IAnimalFactory {
@Override
public ICat createCat() {
return new BlackCat();
}
public IDog createDog() {
return new BlackDog();
}
}
- AbstractProduct
定義抽象工廠中要生產(chǎn)的抽象產(chǎn)品接口ICat和IDog
public interface ICat {
/**
* 定義方法
*/
void eat();
}
public interface IDog {
/**
* 定義方法
*/
void eat();
}
- ConcreteProduct
創(chuàng)建產(chǎn)品的實(shí)現(xiàn)類BlackCat、BlackDog、WhiteCat、WhiteDog
public class BlackCat implements ICat {
@Override
public void eat() {
System.out.println("The black cat is eating!");
}
}
public class BlackDog implements IDog {
@Override
public void eat() {
System.out.println("The black dog is eating");
}
}
public class WhiteCat implements ICat {
@Override
public void eat() {
System.out.println("The white cat is eating!");
}
}
public class WhiteDog implements IDog {
@Override
public void eat() {
System.out.println("The white dog is eating!");
}
}
- Client
定義一個測試類Test
public class Test {
public static void main(String[] args) {
IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
ICat blackCat = blackAnimalFactory.createCat();
blackCat.eat();
IDog blackDog = blackAnimalFactory.createDog();
blackDog.eat();
IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
ICat whiteCat = whiteAnimalFactory.createCat();
whiteCat.eat();
IDog whiteDog = whiteAnimalFactory.createDog();
whiteDog.eat();
}
}
- 輸出結(jié)果
The black cat is eating!
The black dog is eating
The white cat is eating!
The white dog is eating!
七、總結(jié)
由此可見,工廠方法確實(shí)為系統(tǒng)結(jié)構(gòu)提供了非常靈活強(qiáng)大的動態(tài)擴(kuò)展機(jī)制,只要我們更換一下具體的工廠方法,系統(tǒng)其他地方無需一點(diǎn)變換,就有可能將系統(tǒng)功能進(jìn)行改頭換面的變化。