設計模式(C#)——抽象工廠模式
推薦閱讀:
在工廠模式中,一個工廠只能建立一種產品,但我們往往希望,一個工廠能建立一系列產品。很明顯工廠模式已經不能滿足我們的需求,於是出現了抽象工廠模式。
抽象工廠模式:為建立一組相關或相互依賴的物件提供一個介面,而且無需指定他們的具體類。
抽象工廠模式:
1.首先是不同產品類的抽象;
2.其次是不同工廠類的抽象;
3.最後是產品不同系列的抽象;
抽象工廠模式要素:
1、抽象工廠(Creator):是工廠方法模式的核心角色,任何在模式中建立的物件的工廠類必須實現這個介面;
2、具體工廠(Concrete Creator):這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件;
3、抽象產品(Product):工廠方法模式所建立的物件的基類,也就是產品物件的共同父類或共同擁有的介面;
4、具體產品(Concrete Product):這個角色實現了抽象產品角色所定義的介面。
下面舉個例子來介紹一下上面幾個要素之間的關係吧。
例如:名稱空間抽象工廠方法模式中包含抽象工廠Factory;具體工廠MNFactory ,YLFactory;抽象產品Milk,Yogurt;具體產品YLMilk,MNMilk,YLYogurt,MNYogurt 。本案例將向大家展示如何使用簡單工廠模式來進行不同的算術運算。
程式碼實現過程:
1.建立抽象產品:
interface Milk//所有牛奶的父類
{
void DisPlay();//顯示牛奶品牌
}
interface Yogurt//所有酸奶的父類
{
void Display();//顯示酸奶品牌
}
- 所有的具體產品的程式碼(伊利牛奶,蒙牛牛奶;伊利酸奶,蒙牛酸奶)
class YLMilk:Milk//伊利牛奶 { public void DisPlay() { Console.WriteLine("我是伊利牛奶!"); } } class MNMilk:Milk//蒙牛牛奶 { public void DisPlay() { Console.WriteLine("我是蒙牛牛奶!"); } } class YLYogurt:Yogurt//伊利酸奶 { public void Display() { Console.WriteLine("我是伊利酸奶!"); } } class MNMilk:Yogurt//蒙牛酸奶 { public void Display() { Console.WriteLine("我是蒙牛酸奶!"); } }
3.抽象工廠
interface Factory//所有工廠的父類
{
Milk CreateMilk();//生產牛奶
Yogurt CreateYogurt();//生產酸奶
}
4.具體工廠(伊利工廠,蒙牛工廠)
class YLFactory:Factory//伊利工廠
{
public Milk CreateMilk()//生產伊利牛奶
{
return new YLMilk();
}
public Yogurt CreateYogurt()//生產伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工廠
{
public MNMilk CreateMilk()//生產蒙牛牛奶
{
return new MNMilk();
}
public MNYogurt CreateYogurt()//生產蒙牛酸奶
{
return new MNYogurt();
}
5.使用該工廠
namespace 抽象工廠模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory();
Milk milk;
milk = fact1.CreateMilk();
milk.Display();
Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
}
整合後的程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工廠模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory();
Milk milk;
milk = fact1.CreateMilk();
milk.Display();
Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
}
interface Milk//所有牛奶的父類
{
void DisPlay();//顯示牛奶品牌
}
interface Yogurt//所有酸奶的父類
{
void Display();//顯示酸奶品牌
}
class YLMilk:Milk//伊利牛奶
{
public void DisPlay()
{
Console.WriteLine("我是伊利牛奶!");
}
}
class MNMilk:Milk//蒙牛牛奶
{
public void DisPlay()
{
Console.WriteLine("我是蒙牛牛奶!");
}
}
class YLYogurt:Yogurt//伊利酸奶
{
public void Display()
{
Console.WriteLine("我是伊利酸奶!");
}
}
class MNMilk:Yogurt//蒙牛酸奶
{
public void Display()
{
Console.WriteLine("我是蒙牛酸奶!");
}
}
interface Factory//所有工廠的父類
{
Milk CreateMilk();//生產牛奶
Yogurt CreateYogurt();//生產酸奶
}
class YLFactory:Factory//伊利工廠
{
public Milk CreateMilk()//生產伊利牛奶
{
return new YLMilk();
}
public Yogurt CreateYogurt()//生產伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工廠
{
public MNMilk CreateMilk()//生產蒙牛牛奶
{
return new MNMilk();
}
public MNYogurt CreateYogurt()//生產蒙牛酸奶
{
return new MNYogurt();
}
}
總之一點,在抽象工廠模式中,客戶端必須針對介面程式設計,絕對不能針對具體的實現類程式設計。否則無法保證程式的擴充套件性和靈活性。不僅僅抽象工廠,在其他的工廠模式中也都是針對介面(抽象)程式設計。
如果對於抽象工廠模式,你有更好的見解,歡迎評論區留言討論。