定義
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類,使得一個(gè)類的實(shí)例化可以延遲到子類實(shí)現(xiàn)。
本質(zhì)
選擇實(shí)現(xiàn)。
簡(jiǎn)單工廠的重點(diǎn)在于選擇,實(shí)現(xiàn)是已經(jīng)做好了的,目的在于為客戶端來(lái)選擇相應(yīng)的實(shí)現(xiàn),從而使得客戶端和實(shí)現(xiàn)之間解耦,這樣一來(lái),實(shí)現(xiàn)發(fā)生了變化,就不用變更客戶端了。
登場(chǎng)角色
-
Product(產(chǎn)品)
產(chǎn)品抽象類,定義了產(chǎn)品特性,即客戶所需要的功能接口。
-
Creator(創(chuàng)建者)
工廠抽象類,定義產(chǎn)品的生成流程,
-
ConcreteProduct(具體的產(chǎn)品)
決定具體的產(chǎn)品,因?yàn)樗鼘?shí)現(xiàn)了產(chǎn)品的特性,可能會(huì)有多個(gè)。
-
ConcreteCreator(具體的創(chuàng)建者)
負(fù)責(zé)生成具體的產(chǎn)品,因?yàn)樗鼘?shí)現(xiàn)了產(chǎn)品的生成流程。
示例代碼
/**
* 產(chǎn)品的抽象類,定義了產(chǎn)品的特性
*/
public abstract class Product {
public abstract void use();
}
/**
* 生成產(chǎn)品的抽象類,定義了生成產(chǎn)品的步驟
*/
public abstract class Factory {
public final Product create(String owner){
Product product = createProduct(owner);
resisterProduct(product);
return product;
}
protected abstract Product createProduct(String owner);
protected abstract void resisterProduct(Product product);
}
/**
* 具體的產(chǎn)品實(shí)現(xiàn)類
*/
public class IDCard extends Product{
private String owner;
IDCard(String owner) {
System.out.println("制作" + owner + "的ID卡");
this.owner = owner;
}
@Override
public void use() {
System.out.println("使用了" + owner + "的ID卡");
}
public String getOwner() {
return owner;
}
}
/**
* 生成產(chǎn)品的工廠,實(shí)現(xiàn)了產(chǎn)品的生產(chǎn)過(guò)程
*/
public class IDCardFactory extends Factory{
private List<String> owners = new ArrayList();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
public List<String> getOwners() {
return owners;
}
@Override
protected void resisterProduct(Product product) {
owners.add(((IDCard)product).getOwner());
}
}
/**
* 測(cè)試
*/
public class RunFactory {
public static void main(String args[]){
Factory factory = new IDCardFactory();
Product idCard1 = factory.create("小明1");
Product idCard2 = factory.create("小明2");
Product idCard3 = factory.create("小明3");
idCard1.use();
idCard2.use();
idCard3.use();
}
}
運(yùn)行結(jié)果
制作小明1的ID卡
制作小明2的ID卡
制作小明3的ID卡
使用了小明1的ID卡
使用了小明2的ID卡
使用了小明3的ID卡
功能
用來(lái)創(chuàng)建一個(gè)具體的類實(shí)例。
優(yōu)點(diǎn)
- 封裝,封裝了對(duì)象的實(shí)現(xiàn)過(guò)程,使外部的調(diào)用能夠面向接口編程。
- 解耦,因?yàn)榉庋b了對(duì)象的實(shí)現(xiàn)過(guò)程,使得外部?jī)H通過(guò)接口調(diào)用就可以得到對(duì)象的引用, 從而實(shí)現(xiàn)了對(duì)象的創(chuàng)建和使用的解耦。
缺點(diǎn)
- 增加了外部獲取對(duì)象的復(fù)雜度,因?yàn)閯?chuàng)建對(duì)象所需要的參數(shù),需要外部提供,這樣就需要外部能夠理解每一個(gè)參數(shù)的含義,增加了使用的難度。
何時(shí)使用
- 想要完全封裝隔離具體實(shí)現(xiàn),讓外部只能通過(guò)接口取得對(duì)象,那么可以選用簡(jiǎn)單工廠模式,讓客戶端通過(guò)工廠提供的接口來(lái)取得對(duì)象,而不用關(guān)心對(duì)象的具體實(shí)現(xiàn)。
- 如果想把對(duì)外創(chuàng)建對(duì)象的職責(zé)集中管理和控制,可以選用簡(jiǎn)單工廠,一個(gè)簡(jiǎn)單工廠模式可以創(chuàng)建很多、不相關(guān)的對(duì)象。