1. 程式人生 > >設計模式(C#)——抽象工廠模式

設計模式(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();//顯示酸奶品牌
    }
  1. 所有的具體產品的程式碼(伊利牛奶,蒙牛牛奶;伊利酸奶,蒙牛酸奶)
	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();
    }
 }

      總之一點,在抽象工廠模式中,客戶端必須針對介面程式設計,絕對不能針對具體的實現類程式設計。否則無法保證程式的擴充套件性和靈活性。不僅僅抽象工廠,在其他的工廠模式中也都是針對介面(抽象)程式設計。

      如果對於抽象工廠模式,你有更好的見解,歡迎評論區留言討論。