设计模式(C#)——抽象工厂模式

版权声明:文章均是博主原创,如需转载,请在文章开头注明出处和署名! https://blog.csdn.net/shirln/article/details/85104793

推荐阅读:

      在工厂模式中,一个工厂只能创建一种产品,但我们往往希望,一个工厂能创建一系列产品。很明显工厂模式已经不能满足我们的需求,于是出现了抽象工厂模式。
      抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式:

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();
    }
 }

      总之一点,在抽象工厂模式中,客户端必须针对接口编程,绝对不能针对具体的实现类编程。否则无法保证程序的扩展性和灵活性。不仅仅抽象工厂,在其他的工厂模式中也都是针对接口(抽象)编程。

      如果对于抽象工厂模式,你有更好的见解,欢迎评论区留言讨论。

猜你喜欢

转载自blog.csdn.net/shirln/article/details/85104793
今日推荐