設計模式(design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、**設計經驗的總結。使用設計模式是為了可重用**、讓**更容易被他人理解、保證**可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使**編制真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。
工廠模式主要有四類:
1、(靜態工廠模式)簡單工廠模式
3、工廠方法模式
4、抽象工廠模式
看了鴻洋大神的部落格,寫得真有趣。他從買肉夾饃開始介紹,我仿照他的寫了個賣拉麵的例子。
首先,同樣你得有個店:lamianstore
package com.example;
/** * created by leiqi on 16-5-12.
*/public class lamianstore else if (type.equals("毛細"))
else if (type.equals("寬拉麵"))
lamian.prepare();;
lamian.lamian();
lamian.zhumian();
return lamian;
}}
package com.example;
/** * created by leiqi on 16-5-12.
*/public abstract class lamian
/*** 拉麵
*/public void lamian ()
/*** 煮麵
*/public void zhumian ()
}
package com.example;
/** * created by leiqi on 16-5-12.
*/public class erxilamian extends lamian
}
package com.example;
/** * created by leiqi on 16-5-12.
*/public class kuanlamian extends lamian
}
package com.example;
/** * created by leiqi on 16-5-12.
*/public class maoxilamian extends lamian
}
現在的設計,雖說可以支援賣拉麵,但是有點問題,拉麵的種類和lamianstore藕合度太高了,如果增加幾種拉麵或是刪除幾種拉麵,那我們就得一直修改selllamian中的方法 ,所以我們需要做一定的修改,此時我們可以考慮簡單工廠模式。
我們開始寫個簡單工廠,把製作拉麵的過程拿出來:
package com.example;
/** * created by leiqi on 16-5-12.
*/public class lamianfactory else if (type.equals("毛細"))
else if (type.equals("寬拉麵"))
return lamian;
}}
然後把lamianstore修改如下:
package com.example;
/** * created by leiqi on 16-5-12.
*/public class lamianstore
/*** 根據傳入的不同型別拉不同的拉麵
*/public lamian selllamian(string type)
}
這就是簡單工廠模式,lamianstore只負責賣拉麵就好,其他法的什麼各種拉麵都與我無關,讓工廠去生產就好拉。
定義:定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。
所謂的決定並不是批模式允許子類本身在執行時做決定,而是指在編寫建立者類時,不需知道建立的產品是哪乙個,選擇了使用哪個子類,就決定了實際建立的產品是什麼。
我們繼續賣拉麵,由於拉麵生意火爆,所以老闆決定在杭州,蘭州,西安開分店。既然有了分店那麼總店呢,成為抽象的啦:
package com.example;
/** * created by leiqi on 16-5-12.
*/public abstract class lamianstore
}
然後再來開三個分店,這裡只拿乙個**來做演示:
package com.example;
/** * created by leiqi on 16-5-13.
*/public class hangzhoulamianstore extends lamianstore else if (type.equals("毛細"))
else if (type.equals("寬拉麵"))
return lamian;
}}
關於杭州所有種類的拉麵就不貼拉。可以看出我們把製作拉麵的過程以抽象方法的形式讓子類取決定拉,對照定義:
1、定義拉建立物件的乙個介面: public abstract lamian createlamian(string type);
2、由子類決定例項化的類,可以看到我們的拉麵是子類生產的,也就是分店成產的。
這不是簡單工廠模式來也能實現嗎?但是沒想到這個問題:如果我要開20個分店 x 6中面/分店,那麼簡單工廠就得多120個if來判斷,很不划算啊,再說每個分店都有自己獨特的秘方和經驗,當然是自己定最好拉。
?????神馬意思呢??????
繼續拿拉麵的例項來說吧,生意火拉肯定就有人會動歪腦子,使用劣質肉和麵粉,想賺更多錢,這樣會搞砸這個牌子的。因此我們就需要建立自己的原材料**渠道,保證高質量的原材料**。
於是乎呢,我們新建乙個提供原材料的介面:
package com.example;
/** * created by leiqi on 16-5-13.
* 提供拉麵的原材料
*/public inte***ce lamianyclfactory
/**
* 根據蘭州當地特色,提供這兩種材料
* **/public class lzlamianylfactroy implements lamianylfactroy
@override
public yuanliao createyuanliao()
}
有拉原材料供貨渠道,我們稍微修改一下lamian的prepare方法:
package com.example;
/** * created by leiqi on 16-5-12.
*/public abstract class lamian
/*** 拉麵
*/public void lamian ()
/*** 煮麵
*/public void zhumian ()
}
好了,現在必須用我們官方原料做為原材料了。
對比定義:
1、提供乙個介面:public inte***ce lamianyclfactory
2、用於建立相關的或依賴物件的家族/*** 生產優質牛肉*/public meat createmeat();/*** 生產麵粉,熬湯的調料等等*/public ycl createycl();,這裡所說的依賴物件的家族就是建立一系列的原材料。
設計模式學習之工廠模式
工廠模式,factorymethod,定義乙個工廠類的基類,基類中不再去實現具體的產品類的例項,而是將產品類的例項化工作放在其子類中進行,然後由客戶端來決定要使用那一種產品類的例項,工廠模式也要求產品類都具有相同的產品基類,這和簡單工廠模式比較相似。個人理解 工廠模式和簡單模式最大的區別是將產品類的...
設計模式之工廠模式學習
與簡單工廠模式相比,工廠模式為每個類增加了乙個工廠類。每個工廠類返回它所對應的類的物件指標。簡單工廠模式的最大優點 工廠類中包含了必要的邏輯判斷。根據客戶端的選擇條件動態的例項化相關的類。沒有在客戶端實現判斷,也就去除了與客戶端的依賴。簡單工廠模式實現計算類結構圖 工廠模式實現計算類結構圖 工廠模式...
設計模式學習之工廠模式
前言 設計模式不是某個api,是一系列經驗總結後的開發模板。工廠模式的分類 工廠方法模式 定義了乙個用於建立方法的介面,讓子類決定例項化哪乙個類。抽象方法模式 定義一系列相關或者相互依賴的介面,無需指定具體的類。是方法模式的擴充套件。工廠模式的意義 需要大量建立某類具有相同屬性的物件時,將例項化的任...