簡單工廠模式
簡單工廠模式並不屬於GoF的23種經典設計模式,但通常將它作為學習其他工廠模式的基礎。
下面我們通過一個類圖來簡單的認識一下簡單工廠模式
簡單工廠模式
代碼實現
Product
public interface Product
{
void sayName();
}
ProductA
class ProductA : Product
{
public void sayName()
{
Console.WriteLine("我是A");
}
}
ProductB
class ProductB : Product
{
public void sayName()
{
Console.WriteLine("我是B");
}
}
ProductFactory
public class ProductFactory
{
public static Product getProductFactory(string name)
{
switch (name)
{
case "A": {
return new ProductA();
} break;
case "B": {
return new ProductB();
} break;
default:
{
return null;
}break;
}
}
}
使用方法
Product a = ProductFactory.getProductFactory("A");
a.sayName();
效果
效果圖
過程解析
從上面的類圖和代碼可以看出,在簡單工廠模式中,我們可以抽取出三類角色:
抽象產品接口
產品的實體類
產品工廠類
抽象產品接口(Product):將產品的共同特徵抽象出來的一個接口,作為工廠類的創建方法的返回值,同時,各個產品實體類同樣需要實現這個接口;
產品實體類(ProductA):具體的產品實體類,是工廠的創建目標;
產品工廠類(ProductFactory): 簡單工廠模式的核心,負責實現創建實體類的具體業務邏輯,由外部調用創建所需要的實體類對象。
簡單工廠模式的適用環境
工廠類負責創建的對象較少
外部(客戶端)只需要知道需要傳入的參數,並不需要關心如何創建該對象
工廠方法模式
工廠方法模式是簡單工廠模式的延伸,下面,我們同樣通過一個類圖來先了解一下工廠方法模式
工廠方法模式
代碼實現
Product
public interface Product
{
void sayName();
}
ProductA
class ProductA : Product
{
public void sayName()
{
Console.WriteLine("我是A");
}
}
ProductB
class ProductB : Product
{
public void sayName()
{
Console.WriteLine("我是B");
}
}
Factory
public interface Factory
{
Product getProduct();
}
ProductFactoryA
class ProductFactoryA : Factory
{
public Product getProduct()
{
return new ProductA();
}
}
ProductFactoryB
class ProductFactoryB : Factory
{
public Product getProduct()
{
return new ProductB();
}
}
調用
Factory a = new ProductFactoryA();
Product product = a.getProduct();
product.sayName();
效果
工廠方法模式效果圖
過程解析
工廠方法模式相較於簡單工廠模式而言,從代碼量上看似乎更為複雜,但在下面這樣的情況中,工廠方法模式會更具優勢:
如果在現有A,B兩種產品的情況下,需要增加C這個產品
那麼在簡單工廠模式下,我們不僅需要增加一個產品類,還需要修改工廠類中getProduct方法的業務邏輯,那麼這樣的修改就會動到我們的源代碼;
如果使用工廠方法模式的話,就只需要增加一個產品類和工廠類就可以完成原功能的升級,不需要修改我們原本已經寫好的源代碼,這樣更利於程序的維護。
同樣是相當於簡單工廠模式來進行分析,工廠方法模式多出了一個角色:
適用環境
客戶端(調用者)不知道他所需要的對象的類
抽象工廠類通過其子類來指定創建那個對象
最後說幾句
這次教程中主要介紹了兩種設計模式(簡單工廠模式和工廠方法模式),通過這兩種模式,大家應該可以看出設計模式的優點。雖說在使用設計模式是有可能會增加程序的代碼量,但在維護和升級上而言,使用設計模式會更優。
閱讀更多 騎著豬豬的CodeMonkey 的文章