【大話設計模式】—— 工廠方法模式
一、概念
想象一下我們的平常見到的工廠,下一個訂單,付了訂金,一段時間後就可以提貨。我們不需要知道工廠是用的什麼機器,怎麼安排工人的,從哪來的材料,僅僅需要一個訂單就好,工廠就可以按照其固定流水線做出我們所需要的產品。設計模式中也有類似的一個大神:工廠方法模式。
下面讓我們來認識一下:
工廠方法模式(Factory Method):定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。
二、UML圖
Product(抽象產品)
ConcreteProduct(具體產品)
Creator(抽象工廠)
ConcreteCreator(具體工廠)
三、例項解析
首先有一個大學生,以學雷鋒的名義去幫助老人做事。
雷鋒類,擁有掃地、洗衣、買米等方法,大學生和志願者繼承雷鋒的光榮傳統,擁有父類雷鋒類的 掃地、洗衣、買米等方法。建立一個總的雷鋒工廠介面用於建立物件,讓子類學雷鋒的大學生工廠 和社群志願者工廠決定例項化哪個類。
程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
}
}
//雷鋒
class LeiFeng
{
public void Sweep()
{
Console.WriteLine("掃地");
}
public void Wash()
{
Console.WriteLine("洗衣");
}
public void BuyRice()
{
Console.WriteLine("買米");
}
}
//學雷鋒的大學生
class Undergraduate : LeiFeng
{ }
//學雷鋒的志願者
class Volunteer : LeiFeng
{ }
//雷鋒工廠
interface IFactory
{
LeiFeng CreateLeiFeng();
}
//學雷鋒的大學生工廠
class UndergraduateFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Undergraduate();
}
}
//學雷鋒的社群志願者工廠
class VolunteerFactory : IFactory
{
public LeiFeng CreateLeiFeng()
{
return new Volunteer();
}
}
}
結果:
四、總結
簡單工廠模式解決了物件的建立問題,它把所有的細節判斷都一股腦的扔給了工廠。工廠包含了必要的邏輯判斷,能夠根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。凡事都有相對性,有利有弊。新增是方便了,但是後期維護和擴充套件都需要修改工廠,違背了開閉原則。
策略模式,封裝了演算法,減少了各種演算法類與使用演算法類之間的耦合,但是將判斷放入了客戶端,無形之間給客戶端增加了壓力。簡單工廠和策略兩者一結合,把判斷隔離出來,單放一個類,就挺好的了。
工廠方法模式是簡單工廠模式的進一步抽象和推廣。它是針對修改工廠這一弊端而誕生出來的。當我們再新增一個演算法的時候,不需要修改原有工廠類,只需要新增此功能的運算類和相應的工廠類就可以了。克服了開閉原則,又保持了封裝物件建立過程的優點。凡事過猶不及,如果增加的產品多了,增加的產品工廠類就增多,額外開發量是很大的。
五、感受
學設計模式,就好像一個公司:有一個大boss(客戶端),負責接收和處理系統事件。大boss安排幾個專業人士(類),能夠完成各自擅長領域的工作(高內聚),但是他們不僅僅要學會各司其職,也要學會合作(耦合)。為了避免這麼多人都一塊討論,效率低下,就出現了各個部門(多型,抽象類),降低了辦公室戀情的概率。。。(低耦合),提高了辦事效率。
每個設計模式跟人一樣都不是十全十美的,只有大家分工合作,才能做到手中無劍,心中無劍的境界。
Ps:期待大家指點O(∩_∩)O~
相關文章
- 設計模式-工廠模式二(工廠方法模式)設計模式
- 【設計模式】工廠方法模式設計模式
- 設計模式-工廠方法模式設計模式
- 設計模式~~~工廠方法模式設計模式
- 設計模式 - 工廠方法模式設計模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 大話設計模式筆記の 簡單工廠模式設計模式筆記
- java設計模式-工廠方法模式Java設計模式
- python設計模式-工廠方法模式Python設計模式
- 設計模式之工廠方法模式設計模式
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- 工廠方法--設計模式設計模式
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 無廢話設計模式(1)--簡單工廠、工廠方法、抽象工廠設計模式抽象
- 掌握設計模式之工廠方法模式設計模式
- 《Head First 設計模式》:工廠方法模式設計模式
- Java設計模式(二):工廠方法模式Java設計模式
- 設計模式(三)抽象工廠方法模式設計模式抽象
- 設計模式筆記---工廠方法模式設計模式筆記
- golang設計模式之工廠方法模式Golang設計模式
- Java設計模式之工廠方法模式Java設計模式
- 設計模式學習(二)工廠模式——工廠方法模式+登錄檔設計模式
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- Yii2設計模式——工廠方法模式設計模式
- Java常用設計模式之工廠方法模式Java設計模式
- 設計模式----工廠模式設計模式
- 【設計模式】工廠模式設計模式
- 設計模式-工廠模式設計模式
- 設計模式 —— 工廠模式設計模式
- 設計模式(工廠模式)設計模式
- 設計模式----工廠設計模式設計模式
- 設計模式-工廠設計模式設計模式
- Typescript 設計模式之工廠方法TypeScript設計模式
- 設計模式-建立型-工廠方法設計模式
- 【重溫設計模式】之003工廠方法模式設計模式
- 嘻哈說:設計模式之工廠方法模式設計模式
- C# 設計模式(1)——簡單工廠模式、工廠模式、抽象工廠模式C#設計模式抽象
- 設計模式學習(二)工廠模式——抽象工廠模式設計模式抽象
- Java設計模式-工廠模式Java設計模式