• C# 设计模式-抽象工厂模式


    一.介绍  

      抽象工厂模式(Abstract Factory Pattern)。属于创建型模式。它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    二.场景

      仍然是举例之前工厂模式使用的买水果例子。我们(调用方)去水果店(工厂接口)买水果,不同水果有不同的售货员(工厂类)负责,我们只要找对应售货员,就能买到对应的水果(工厂类将水果类实例化,返回对象)。现在,水果店升级,不光只卖水果,还卖水果饮料(工厂接口提供返回水果类和返回水果饮料接口),对应售货员也负责对应的水果和水果饮料。

    三.实现

      定义父类接口IFruit(水果)和水果类。

    public interface IFruit
    {
        public string Name { get; set; }
    }
    
    public class Apple : IFruit
    {
        public string Name { get; set; } = "苹果";
    }
    
    public class Orange : IFruit
    {
        public string Name { get; set; } = "";
    }

      定义父类接口IFruitDrink(水果饮料)和水果饮料类。

    public interface IFruitDrink
    {
        public string Name { get; set; }
    }
    
    public class AppleDrink : IFruitDrink
    {
        public string Name { get; set; } = "苹果饮料";
    }
    
    public class OrangeDrink : IFruitDrink
    {
        public string Name { get; set; } = "橙饮料";
    }

      定义工厂接口和工厂类。

    public interface IFactory
    {
        IFruit CreateFruit();
    
        IFruitDrink CreateFruitDrink();
    }
    
    public class AppleFactory : IFactory
    {
        public IFruit CreateFruit()
        {
            return new Apple();
        }
    
        public IFruitDrink CreateFruitDrink()
        {
            return new AppleDrink();
        }
    }
    
    public class OrangeFactory : IFactory
    {
        public IFruit CreateFruit()
        {
            return new Orange();
        }
    
        public IFruitDrink CreateFruitDrink()
        {
            return new AppleDrink();
        }
    }

      调用工厂类,获取苹果和苹果饮料。

    public static void Main(string[] args)
    {
        //苹果
        IFactory factory = new AppleFactory();
        IFruit fruit = factory.CreateFruit();
        IFruitDrink fruitDrink = factory.CreateFruitDrink();
        Console.WriteLine(fruit.Name);
        Console.WriteLine(fruitDrink.Name);
    }

    四.总结

      可以看出,抽象工厂模式和工厂方法模式的区别就是,抽象工厂模式是生产多个产品,工厂方法模式是生产单个产品。只有一种产品的抽象工厂模式就是工厂方法模式,可以把工厂方法模式当成是抽象工厂模式的一个特例。

      抽象工厂模式有和工厂方法模式的优点,对添加系列产品是符合开闭原则的。比如新增一种香蕉和香蕉饮料,可以直接新增香蕉类、香蕉饮料类和香蕉工厂类,而不影响现有功能。

      缺点就是对新增新产品是不符合开闭原则的,比如新增产品雪糕,不仅要新增雪糕接口和雪糕类,还得修改抽象工厂类,新增一个返回雪糕的接口。原有的苹果工厂和橙工厂也得去实现这个返回雪糕的接口方法。

      

  • 相关阅读:
    第二节.NET两种交互模式:c/s和b/s
    python自动登录代码
    关于C# webapi ,接口返回字符串和json格式 ,返回值中有反斜杠
    利用java内部静态类实现懒汉式单例
    Linux,Ubuntu,Mint 环境下 navicat 乱码问题
    如何在Linux中使用命令行卸载软件
    Linux安装Oracle JDK替换OpenJDK详解
    【踩坑】利用fastjson反序列化需要默认构造函数
    基于 Markdown 编写接口文档
    Gradle里面两个 依赖管理插件,可以不用关心 具体jar版本号
  • 原文地址:https://www.cnblogs.com/shadoll/p/14240913.html
Copyright © 2020-2023  润新知