這次不做標題黨了碴倾,而且也怕自己總結的有問題跪解,所以希望大家看到問題可以及時指正吧,一步一步的寫設計模式筆記好了楷兽,畢竟設計模式還是太多了地熄。不是單獨去學就能完全掌握的,具體還是在實踐中體會芯杀。接下來進入這次的主題:
簡單工廠(靜態(tài)工廠)
- 所屬:創(chuàng)建型模式
- 意圖:定義一個創(chuàng)建對象的接口端考,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創(chuàng)建過程延遲到子類進行揭厚。
- 何時使用:我們明確地計劃不同條件下創(chuàng)建不同實例時却特。
- 如何解決:讓其子類實現(xiàn)工廠接口,返回的也是一個抽象的產(chǎn)品筛圆。
- 關鍵代碼:創(chuàng)建過程在其子類執(zhí)行裂明。
- 優(yōu)點:
1、一個調(diào)用者想創(chuàng)建一個對象太援,只要知道其名稱就可以了闽晦。
2、擴展性高提岔,如果想增加一個產(chǎn)品仙蛉,只要擴展一個工廠類就可以。 3碱蒙、屏蔽產(chǎn)品的具體實現(xiàn)荠瘪,調(diào)用者只關心產(chǎn)品的接口。
比如說,想生產(chǎn)圓形哀墓、矩形趁餐、三角形。
假設已經(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ù)去滿足我們的需求。說多了瘩例。啊胶。。我們繼續(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返回給我臊恋。這里很好的利用了面向對象的封裝和多態(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,使用設計模式可能反而會變得復雜益涧,但是如果工程項目大了起來锈锤,設計模式就顯得尤為重要了!這里轉一句知乎大神的一句話:
在實際的項目中闲询,在你通往架構師的道路上久免,你要培養(yǎng)出一種感覺:要new一個實體對象是件很謹慎的事情(不是指值對象),不要隨便new扭弧。最好不要自己new阎姥,讓別人去new,傳給你去調(diào)用鸽捻。這樣new錯了也是別人的事呼巴,換而言之你的模塊是好質(zhì)量的泽腮,禁得起推敲的。那么都不愿意去new衣赶,誰去new诊赊?讓專門的一個工廠去new。請注意:這僅僅是解決new的方式之一府瞄,此外還要反射啊等等碧磅。那你必須要等到真正接觸大型項目才能有體味的。
作者:余葉
鏈接:https://www.zhihu.com/question/24843188/answer/49197026
來源:知乎
著作權歸作者所有遵馆。商業(yè)轉載請聯(lián)系作者獲得授權鲸郊,非商業(yè)轉載請注明出處。
我發(fā)現(xiàn)當項目閱歷不足夠的時候去學習設計模式是一件很費力的事情团搞,因為沒接觸過大的項目严望,就沒有遇到過特定的需求,一直通過自己研究的小的東西逻恐,然后跳過實戰(zhàn)去看原理湾蔓、去奢求掌实,不足以讓我們?nèi)ズ暧^的看問題。
所以我這幾天給自己的警醒是:
實踐很重要,在實踐中去思考更重要饶氏。跳過實踐去研究原理,研究明白一時志膀,到了該用的時候不知道咋用~豈不是很悲哀人灼?
此文參考:
菜鳥教程——工廠模式