zoukankan      html  css  js  c++  java
  • C# 设计模式-工厂方法模式

    一.介绍  

      工厂方法模式(Factory Method Pattern)。属于创建型模式。定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

    二.场景

      比如我们去水果店买水果,我们只要说出要买什么水果,水果店就会给我们什么水果。这里的水果店相当于一个工厂接口,水果店下不同的水果有不同售货员,售货员就是这工厂接口的具体实现。我们买水果,就找到对应水果的售货员,然后售货员去new一个水果类。

    三.实现

      定义父类接口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; } = "";
    }

      定义工厂接口IFactory。

    public interface IFactory
    {
        IFruit CreateFruit();
    }

      对应工厂的实现,不同的工厂类负责实例化不同的水果类。

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

      调用工厂类方法去实例化水果类。

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

      在工厂方法模式中,如果想要新增一种新的水果,只需要新增水果类和对应工厂类,原有的工厂代码不需要进行修改,而不像在简单工厂模式中要修改工厂类的代码。比如新增水果香蕉。

    public class Banana : IFruit
    {
        public string Name { get; set; } = "香蕉";
    }
    
    public class BananaFactory : IFactory
    {
        public IFruit CreateFruit()
        {
            return new Banana();
        }
    }
    
    public static void Main(string[] args)
    {
        IFactory factory = new BananaFactory();
        IFruit fruit = factory.CreateFruit();
        Console.WriteLine(fruit.Name);
    }

    四.总结

      工厂方法模式把具体实例化的过程延伸到具体的工厂类中,解决了简单工厂模式中要新增水果类就得改工厂类代码的缺点,符合了开闭原则(对拓展开放,对修改封闭)。

      缺点是每新增一个水果类,就得新增一个对应的工厂类,增加代码量。

      

  • 相关阅读:
    Sqlserver 2008:sp_msforeachdb 坑爹的错误陷阱
    安装官方 Synaptics 驱动,终于解决 HP Pavilion G4 笔记本 讨厌的触摸板锁定问题!
    Sqlserver 2008+:变更数据捕获(CDC) 和 更改跟踪(CT)
    PHP.ini 性能优化
    PHP Notice: Undefined index: ... 问题的解决方案
    查询类方法代码分析
    页面跳转方法总结大全
    如何关闭searchIndexer.exe进程
    如何正确运用PHP ini_set函数
    PHP中的串行化变量和序列化对象
  • 原文地址:https://www.cnblogs.com/shadoll/p/14234882.html
Copyright © 2011-2022 走看看