天天看點

設計模式(C#)——02抽象工廠模式

推薦閱讀:
  •  我的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();//顯示酸奶品牌
    }
           
  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();
    }
 }
           

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

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

繼續閱讀