最近在看設計模式,故事好玩是好玩,可是代碼也很多啊,有時候看圖不太了解,為了讓自己有興趣并且堅持下去,在第一遍宏觀的看了一遍之後,把23種設計模式進行了一下分類,然後再找類似的模式一起學習,通過對比學習再了解,确實是容易了一些。先學的建立型模式裡的工廠三姐妹,一塊學習這三個模式,比較一下它們的優缺點,知道什麼時候要用什麼模式。
一、概念介紹
1、簡單工廠:Simple Factory,是由一個工廠對象決定建立出哪一種産品類的執行個體,是工廠模式家族中最簡單實用的模式。
個人了解:将界面與業務邏輯分離,分離出一個類專門來建立執行個體的過程。
2、工廠方法:Factory Method,定義一個用于建立對象的接口,讓子類決定執行個體化哪一個類,工廠方法使一個類的執行個體化延遲到其子類。
個人了解:為了遵循擴充開放,修改關閉原則,将簡單工廠類轉換為工廠方法接口,将其Switch分支分離成子類去繼承工廠方法接口類,順利的将建立對象的過程延遲到子類。
3、抽象工廠:Abstract Factory,提供一個建立一系列相關或互相依賴對象的接口,而無需指定他們具體的類。
個人了解:工廠方法模式的轉變,增加工廠方法接口的方法就重構出了抽象工廠。
二、執行個體講解(以通路DB為例)
1、Simple Factory
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX1cmaOlnRHRmesNTYqZFSiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DO2QjN1IDM1EDNxITM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
建立一個簡單工廠,用來建立執行個體化User類和Department類。在用戶端代碼中直接得到資料庫通路執行個體即可,不依賴與Sqlserver與Access資料庫。
用戶端代碼:
static void Main(string [] args)
{
User user = new User();
Department department = new department();
IUser su=DataAccess.CreateUser ();
su.Insert(user);
su.GetUser(1);
IDepartment ide = DataAccess.CreateDepartment();
ide.Insert(department);
ide.GetDepartment(343);
Console.Read();
}
2、Factory Method
需要用到3個工廠,達到了業務邏輯與資料通路分離,用戶端代碼在運作時不需要知道在通路哪個資料庫。
用戶端代碼:
static void Main(string [] args)
{
User user = new User();
Ifactory factory=new AccessFactory();
IUser su=factory.CreateUser ();
su.Insert(user);
su.GetUser(1);
Console.Read();
}
3、Abstract Factory
增加了通路的資料庫中的表,隻需增加相應的類以及接口,在Ifactory接口中增加相對應的建立對象的方法即可。
用戶端代碼(與工廠方法類似):
static void Main(string [] args)
{
User user = new User();
Department department = new Department();
Ifactory factory=new AccessFactory();//确定執行個體化哪一個資料庫通路對象給factory
IUser su=factory.CreateUser ();//與具體的資料庫解除了依賴
su.Insert(user);
su.GetUser(1);
IDepartment ide = factory.CreateDepartment();
ide.Insert(department);
ide.GetDepartment(343);
Console.Read();
}
三、比較
1、簡單工廠VS工廠方法
相同點:都達到了業務邏輯與通路資料的分離。
不同點:
(1)簡單工廠:對象的執行個體化在工廠中,需要用Switch進行條件選擇,違背了修改關閉的原則,但是對于用戶端來說,去除了對具體産品的依賴。
(2)工廠方法:将執行個體化的過程延遲到子類,工廠方法将内部邏輯判斷轉移到了用戶端中,隻需要修改用戶端即可。遵循了開放——封閉原則。
2、抽象工廠優點VS缺點
優點:改變一個産品系列時,隻需改變具體的工廠即可,沒有其他的變動,與具體産品無關。遵循了開放——封閉原與依賴倒轉原則。
缺點:如果增加一個功能,就要增加相應的類,接口,還要改變Ifactory工廠,SqlserverFactory以及AccessFactory三個工廠類。
四、感受
剛開始的時候覺得有些地方還是有點不太了解,等到總結要畫圖的時候突然就明白了一些,看來還是畫圖的作用大啊,往下學設計模式的時候要邊畫圖邊敲代碼,這樣了解會好一些的。 不足之處:對這三個模式的學習時間長了一些,丢了宏觀。接下來要好好調整一下戰略。