• 设计模式 简单工厂模式


    简单工厂模式

    一.什么是简单工厂?

    传统理解:简单工厂属于创建型模式,有叫做静态工厂方法模式,但不属于23中GOF设计模式之一。简单工厂是由一个工厂对象决定创建出那一种产品类的实例。简单工厂模式是工厂模式家族中最简单的模式,可以理解为是不同工厂模式的一个特殊实现。

    个人理解:简单工厂并非设计模式而是编程习惯,最起码它不属于GOF23种设计模式之一,但是经常可以看到使用简单工厂的项目,因为它的思想很简单。简单工厂,可以从字面理解是工厂,既然是工厂就是用来生产产品的,在编程里那么他就是用来创建对象的实例的。那么在工厂类中尽可能不要出现业务逻辑,不然会污染工厂。要做到单一职责,工厂就是用来生产对象的实例的。作用其实和new作用一样。

    二.分析:

    用皮具厂的例子把!

    首先老板接到一订单,客户要求皮具厂生产皮包(钱包,旅行包,背包,电脑包)于是乎,老板就创办一个工厂(皮包抽象产品)。皮包工厂创建多个车间(皮包的具体产品)用来生产具体的产品,如钱包,旅行包。接下来我们就用编程来实现吧。

    二.Demo:

    1.普通实现工厂模式:

    枚举:

     /// <summary>
        /// 包包类型
        /// </summary>
        public enum PageEnum
        {
            /// <summary>
            /// 钱包
            /// </summary>
            Wallet = 0,
    
            /// <summary>
            /// 旅行包
            /// </summary>
            TravellingBag = 1
        }


    其他的都可以参考泛型方式实现简单工厂模式的案例,下面就写个工厂的例子

    /// <summary>
            /// 创建对象实例
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public IPage CreateInstance(PageEnum type)
            {
                IPage p = null;
                switch (type)
                {
                    case PageEnum.Wallet:
                        p = new Wallet();
                        break;
                    case PageEnum.TravellingBag:
                        p = new TravellingBag();
                        break;
                    default:
                        break;
                }
                return p;
            }
    

    2.通过泛型类实现简单工厂模式:

    接口:

     /// <summary>
        /// 产品抽象类(包包)
        /// </summary>
       public interface IPage
        {
            /// <summary>
            /// 制作
            /// </summary>
           void Make();
        }

    产品1:

     /// <summary>
        /// 钱包
        /// </summary>
       public class Wallet:IPage
       {
           /// <summary>
           /// 实现接口中的制作函数
           /// </summary>
           public void Make()
           {
               Console.WriteLine("生产钱包");
           }
       }

    产品2:

      /// <summary>
        /// 旅行包
        /// </summary>
        class TravellingBag:IPage
        {
            /// <summary>
            /// 实现接口中的制作函数
            /// </summary>
            public void Make()
            {
                Console.WriteLine("生产旅行包");
            }
        }

    工厂:

    这里使用了new约束,参考官网文档:

    https://msdn.microsoft.com/zh-CN/library/sd2w2ew5.aspx

     /// <summary>
        /// 包包工厂
        /// </summary>
        public class PageFactory<T> where T : new()
        {
            /// <summary>
            /// 创建对象实例
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public T CreateInstance()
            {
                return new T();
            }
        }


    调用:

     class Program
        {
            static void Main(string[] args)
            {
                //接了一单生意,生产一批皮包,首先创建一个工厂
                var factory = new PageFactory<Wallet>();
                var page = factory.CreateInstance();
                page.Make();
                Console.Read();
            }
        }


    结果:

    三注意:

     
  • 相关阅读:
    Linux 期中架构 PHP
    Linux 期中架构 MySQL
    Python 示例 饮水记录
    Linux 期中架构 inotify
    Linux期中架构 全网备份案例
    分布式存储系统Ceph部署过程 · Jayden's Blog
    Go语言汇编器的设计
    linux基础3
    6.2.2 多余的列另起一行
    linux网络设备驱动2
  • 原文地址:https://www.cnblogs.com/zlp520/p/6292187.html
Copyright © 2020-2023  润新知