推薦閱讀:
- 我的CSDN
- 我的部落格園
- QQ群:704621321
在工廠模式中,一個工廠隻能建立一種産品,但我們往往希望,一個工廠能建立一系列産品。很明顯工廠模式已經不能滿足我們的需求,于是出現了抽象工廠模式。
抽象工廠模式:為建立一組相關或互相依賴的對象提供一個接口,而且無需指定他們的具體類。
抽象工廠模式:
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();
}
}
總之一點,在抽象工廠模式中,用戶端必須針對接口程式設計,絕對不能針對具體的實作類程式設計。否則無法保證程式的擴充性和靈活性。不僅僅抽象工廠,在其他的工廠模式中也都是針對接口(抽象)程式設計。
如果對于抽象工廠模式,你有更好的見解,歡迎評論區留言讨論。