這次不做標題黨了,而且也怕自己總結(jié)的有問題,所以希望大家看到問題可以及時指正吧,一步一步的寫設(shè)計模式筆記好了,畢竟設(shè)計模式還是太多了。不是單獨去學就能完全掌握的,具體還是在實踐中體會。接下來進入這次的主題:
簡單工廠(靜態(tài)工廠)
- 所屬:創(chuàng)建型模式
- 意圖:定義一個創(chuàng)建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創(chuàng)建過程延遲到子類進行。
- 何時使用:我們明確地計劃不同條件下創(chuàng)建不同實例時。
- 如何解決:讓其子類實現(xiàn)工廠接口,返回的也是一個抽象的產(chǎn)品。
- 關(guān)鍵代碼:創(chuàng)建過程在其子類執(zhí)行。
- 優(yōu)點:
1、一個調(diào)用者想創(chuàng)建一個對象,只要知道其名稱就可以了。
2、擴展性高,如果想增加一個產(chǎn)品,只要擴展一個工廠類就可以。 3、屏蔽產(chǎn)品的具體實現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。
比如說,想生產(chǎn)圓形、矩形、三角形。
假設(shè)已經(jīng)有實體類Circle、Square、Rectangle三個類,里面各有show()方法:
那么main中我們需要這么做:
Circle oldCircle = new Circle();
Square oldSquare = new Square();
Rectangle oldRectangle = new Rectangle();
oldCircle.show();
oldSquare.show();
oldRectangle.show();
當然這調(diào)用也沒啥問題。
不過這么做,我們需要new三個對象,寫程序盡量不要隨便使用new。原因后面會說。
所以我們選擇創(chuàng)建一個工廠Factory,由他去生產(chǎn),而我們要做的事情,就是傳參~我們傳參,他去根據(jù)參數(shù)的不同,去選擇生產(chǎn)的對象。其實我在寫策略模式的時候,總有錯覺,這些設(shè)計模式非常相似,都是通過傳各種各樣參數(shù)去滿足我們的需求。說多了。。。我們繼續(xù):
創(chuàng)建一個工廠類,他的任務就是接收參數(shù),然后判斷需要new出個什么。
/**
* Created by AceCream on 2017/4/1.
*/
public class ShapeFactory {
public Shape getShape(String string){
Shape shape = null;
switch (string){
case "Square":
shape = new Square();
break;
case "Circle":
shape = new Circle();
break;
case "Rectangle":
shape = new Rectangle();
break;
}
return shape;
}
}
上面的代碼就是,我通過獲取到字符串,返回Shape類型,Shape是個接口,里面有我們圖形類必須有的show()方法,這時候圖形類只需要實現(xiàn)Shape這個接口即可~
Ps:說一下,盡量不要瞎用if...else,因為每一次選擇你都需要判斷很多條件。
例如:
public class Circle implements Shape{
@Override
public void show() {
System.out.println("我是圓形...");
}
}
隨后我們看一下實現(xiàn)類:
/**
* Created by AceCream on 2017/4/1.
*/
public class ShapeDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape circle = shapeFactory.getShape("Circle");
circle.show();
Shape rectangle = shapeFactory.getShape("Rectangle");
rectangle.show();
Shape square = shapeFactory.getShape("Square");
square.show();
}
}
看!我只new了一個工廠,當我需要Circle的時候,我就告訴工廠:“你去查查看,生產(chǎn)個Circle給我”。他就去找,然后new出一個Circle返回給我。這里很好的利用了面向?qū)ο蟮姆庋b和多態(tài)!這就是簡單工廠咯~
至于抽象工廠,我給大家貼個圖:
簡單解釋一下:Red、Green、Blue類是顏色,由ColorFactory生產(chǎn),剩下的那部分還是和上面一樣由ShapeFactory生產(chǎn)。
多了個啥?
/**
* Created by AceCream on 2017/4/1.
* 抽象工廠
* 為 Color 和 Shape 對象創(chuàng)建抽象類來獲取工廠。
*/
public abstract class AbstractFactory {
abstract Color getColor(String color);
abstract Shape getShape(String shape);
}
對~就是上面這玩意,用了就是抽象工廠了。
其實感覺抽象工廠模式挺臃腫的,而且個人感覺啊,不是很喜歡它。而事實也是:基本上很多人一輩子都用不上它,所以我給自己的標準是——重要的東西必須弄個明白!但是腦容量有限,剩下的知道大概就好了,用時候就去查也能馬上撿起來。
后面的話(個人的階段學習體會,可以跳過)
所以!我會困惑為什么需要工廠模式?
是的,如果是我們?nèi)粘懘a,使用設(shè)計模式可能反而會變得復雜,但是如果工程項目大了起來,設(shè)計模式就顯得尤為重要了!這里轉(zhuǎn)一句知乎大神的一句話:
在實際的項目中,在你通往架構(gòu)師的道路上,你要培養(yǎng)出一種感覺:要new一個實體對象是件很謹慎的事情(不是指值對象),不要隨便new。最好不要自己new,讓別人去new,傳給你去調(diào)用。這樣new錯了也是別人的事,換而言之你的模塊是好質(zhì)量的,禁得起推敲的。那么都不愿意去new,誰去new?讓專門的一個工廠去new。請注意:這僅僅是解決new的方式之一,此外還要反射啊等等。那你必須要等到真正接觸大型項目才能有體味的。
作者:余葉
鏈接:https://www.zhihu.com/question/24843188/answer/49197026
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
我發(fā)現(xiàn)當項目閱歷不足夠的時候去學習設(shè)計模式是一件很費力的事情,因為沒接觸過大的項目,就沒有遇到過特定的需求,一直通過自己研究的小的東西,然后跳過實戰(zhàn)去看原理、去奢求,不足以讓我們?nèi)ズ暧^的看問題。
所以我這幾天給自己的警醒是:
實踐很重要,在實踐中去思考更重要。跳過實踐去研究原理,研究明白一時,到了該用的時候不知道咋用~豈不是很悲哀?
此文參考:
菜鳥教程——工廠模式