在工廠方法模式中布轿,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類戚炫。
模式結(jié)構(gòu)
1.AbstractProduct:抽象產(chǎn)品
2.ConcreteProduct具體產(chǎn)品
3.AbstractFactory抽象工廠
4.ConcreteFactory:具體工廠
UML:
抽象產(chǎn)品角色
public abstract class Product {
//所有產(chǎn)品類的公共業(yè)務(wù)方法
public void methodSame() {
//公共方法的實(shí)現(xiàn)
}
//聲明抽象業(yè)務(wù)方法
public abstract void methodDiff();
}
具體產(chǎn)品
//具體產(chǎn)品A
public class ConcreteProductA extends Product {
// 產(chǎn)品A實(shí)現(xiàn)方法
@Override
public void methodDiff() {
}
}
//具體產(chǎn)品B
public class ConcreteProductB extends Product {
//產(chǎn)品B實(shí)現(xiàn)方法
@Override
public void methodDiff() {
}
}
抽象工廠角色
//抽象工廠接口
public interface AbstractFactory {
Product getProduct();
}
具體工廠角色
//A工廠
public class AFactory implements AbstractFactory {
@Override
public Product getProduct() {
return new ConcreteProductA();
}
}
//B工廠
public class BFatory implements AbstractFactory {
@Override
public Product getProduct() {
return new ConcreteProductB();
}
}
客戶端引用
public class Main {
public static void main(String[] args) {
//A產(chǎn)品讀取
AbstractFactory abstractFactory = new AFactory();
Product productA = abstractFactory.getProduct();
productA.methodSame();
productA.methodDiff();
//B產(chǎn)品讀取
AbstractFactory factory = new BFactory();
Product productB = factory.getProduct();
productB.methodSame();
productB.methodDiff();
}
}
工廠模式優(yōu)點(diǎn)
1.工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié)
2.它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對(duì)象媳纬,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部双肤。
3.在系統(tǒng)中加入新產(chǎn)品時(shí)施掏,無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端茅糜,也無須修改其他的具體工廠和具體產(chǎn)品七芭,而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了。這樣蔑赘,系統(tǒng)的可擴(kuò)展性也就變得非常好狸驳,完全符合“開閉原則”。
工廠模式缺點(diǎn)
1.需要編寫新的具體產(chǎn)品類缩赛,而且還要提供與之對(duì)應(yīng)的具體工廠類锌历,增加系統(tǒng)開銷。
2.由于考慮到系統(tǒng)的可擴(kuò)展性峦筒,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義窗慎,增加了系統(tǒng)的抽象性和理解難度物喷,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù)遮斥,增加了系統(tǒng)的實(shí)現(xiàn)難度峦失。
適用環(huán)境
1.客戶端不需要知道它所創(chuàng)建的對(duì)象的類。例子中我們不知道產(chǎn)品具體叫什么名术吗,只知道創(chuàng)建它的工廠名就完成了創(chuàng)建過程尉辑。
2.客戶端可以通過子類來指定創(chuàng)建對(duì)應(yīng)的對(duì)象。