個人博客CoorChice,https://chenbingx.github.io/ ,最新文章將會首發(fā)CoorChice的博客,歡迎探索哦 !
同時,搜索微信公眾號CoorChice
岩调,或掃描文章末尾二維碼,可以關(guān)注我的微信公眾號赡盘。同期文章也將會優(yōu)先推送到微信公眾號中号枕,以提醒您有新鮮文章出爐。
工廠方法模式和簡單工廠模式本質(zhì)是類似的陨享,都是用來封裝產(chǎn)品的創(chuàng)建過程葱淳。但它們的實現(xiàn)也有很大的,所以通常被作為兩種不同的設(shè)計模式看待抛姑。
定義及實質(zhì)
-
定義
定義一個用于創(chuàng)建對象的接口赞厕,讓子類決定實例化那一個對象,即使一個類的實現(xiàn)延遲到子類實現(xiàn)定硝。 -
實質(zhì)
延遲到子類選擇實現(xiàn)皿桑。
雖然都是選擇實現(xiàn),但工廠方法模式主要用于創(chuàng)建一系列的產(chǎn)品簇(就是相似的東西)蔬啡,而簡單工廠法可以創(chuàng)建任何互相沒有關(guān)聯(lián)的實例诲侮。
模式圖解
工廠方法模式UML圖
從上圖可以看出:
- Creator是抽象父類,ConcreteCreator是其子類箱蟆;
- ConcreteCreator重寫了父類的factoryMethod() 來創(chuàng)建真正的產(chǎn)品ConcreteProduct沟绪,也就是說ConcreteCreator依賴ConcreteProduct;需要注意空猜,Creator依賴的是Product绽慈;
- ConcreteProduct實現(xiàn)了Product接口。
//Creator
public abstract class Creator{
public abstrat Product factoryMethod();
public void someOpration(){
//在這里延遲創(chuàng)建了Product
factorMethod().doSomthing();
}
}
//ConcreteCreator
public class ConcreteCreator extends Creator{
@Overrid
public Product factoryMethod(){
return new ConcreteProduct();
}
}
//Product
public interface Product{
void doSomthing();
}
//public class ConcreteProduct implement Product{
@Overrid
public void doSomthing(){
System.out.println("ConcreteProduct");
}
}
下面看看Client怎么使用:
public class Client{
priavte Creator creator;
public static void main(String[] args){
creator = new ConcreteCreator(); //創(chuàng)建符合需求的Creator子類
creator.someOpration(); //調(diào)用這個方法才會創(chuàng)建Product
}
}
工廠方法模式順序圖
結(jié)合上面的代碼看辈毯。
模式優(yōu)缺點
優(yōu)勢
- 體現(xiàn)了依賴倒置 的原則久信,使程序的可擴展性增強,當有新需求時漓摩,只需要增加新的Creator子類,替換Client中的子類入客,而不需要修改其它地方管毙;
- 可以在不知道對象創(chuàng)建過程未確定的情況下進行編程腿椎;
- 可以很好的鏈接平行類層次結(jié)構(gòu)。
缺點
- 工廠類和產(chǎn)品類耦合在一起夭咬。
拓展
平行類層次結(jié)構(gòu)
指一個類層級(工廠方法模式中啃炸,每個Creator的抽象就代表著一個類層級)中的每一個類,在另一個類層級中都有對應(yīng)的類與之呼應(yīng)卓舵,這樣的一組類層就稱為平行類層次結(jié)構(gòu) 南用。
解釋:
以Shape為例,具體的Shape對象和Shape對象的行為就構(gòu)成了平行類層次結(jié)構(gòu)掏湾。Shape對象層級中有Rectangle裹虫、Oval等,在Shape對象行為層級中融击,有Rectangle筑公、Oval等的面積、周長等行為與之對應(yīng)尊浪。所以它們構(gòu)成了平行類層次結(jié)構(gòu)匣屡。