zoukankan      html  css  js  c++  java
  • 23种设计模式--工厂模式-Factory Pattern

    一、工厂模式的介绍

          工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例就就依赖与这个类,2者之间的耦合度就高,此时我们就可以使用面向对象的去解决这个问题,将变化点封装起来,这就是我们将要首先引入的简单工厂模式;先来说一个场景,比如我们吃水果这个例子吧,我们有时候想吃苹果,有时候想吃橘子,但是每次都需要去买这些水果,后来有个水果店,又卖橘子,又卖苹果,这个水果店就当于简单工厂里面的工厂,但是这样的我们想吃什么水果只能看水果店有没有,没有就吃不到,后来人们又想出了一个办法那就是开来了水果园,你想吃什么我就种什么,这样就满足吃一切水果的想法,这也就是所说的工厂模式--下面又我们由普通-简单工厂-工厂模式-最后来个抽象工厂--不过抽象工厂等下篇再谈;

    二、工厂模式Demo

         无模式下的吃水果

        /// <summary>
        /// 水果类
        /// </summary>
        public abstract class Fruit
        {
            public abstract void Eat();
        }

       public class Apple : Fruit
        {
            public override void Eat()
            {
                Console.WriteLine("我吃苹果");
            }
        }

        public class Orange : Fruit
        {
            public override void Eat()
            {
                Console.WriteLine("我吃橘子");
            }
        }

          static void Main(string[] args)
            {
                //当出现直接new的时候我们就应该考虑是否使用工厂模式
                //这里违反oo的原则,我们需要将改变的封装起来
                //当然下一步我们先进行简单工厂的例子
                Fruit fruit = new Apple();
                fruit.Eat();

                Fruit fruit2 = new Orange();
                fruit2.Eat();

                Console.ReadKey();
            }

                 简单工厂模式下的吃水果

          水果类在这就贴出来了,和上面的情况一样,主要贴出来简单工厂这一块的,这一块我使用了一个枚举,来表示不同的类型

           public enum FruitEnum
          {
            Apple=1,
            Orange=2
          }

         /// <summary>
        /// 创建具体实例的简单工厂
        /// 当然明智的大家又会发现下面也都new,假如说我们增加一个类的情况下又要修改代码,好吧我们这么懒惰这不是我们干的事,那就引出我们下一位优秀的设计师那就是工厂设计师;
        /// </summary>
        public class SimpleFactoryFruit
        {
            public static Fruit CreateFactory(FruitEnum friutEnum)
            {
                switch (friutEnum)
                {
                    case FruitEnum.Apple:
                        return new Apple();
                    case FruitEnum.Orange:
                        return new Orange();
                    default:
                        throw new Exception("暂时没有你想吃的水果");
                }
            }
        }

        static void Main(string[] args)
            {
                //简单工厂将变化的水果封装到工厂里面使用不同的类型创建不同的对象将我们对水果的依赖变成间接的,使得对象之间的耦合度降低,但是创建对象的工厂里面,每增加一种水果就需要增加一种判断,这就是简单工厂的缺点;
                Fruit fruit = SimpleFactoryFruit.CreateFactory(FruitEnum.Apple);
                fruit.Eat();
                Fruit fruit2 = SimpleFactoryFruit.CreateFactory(FruitEnum.Orange);
                fruit2.Eat();
                Console.ReadKey();
            }

         工厂模式下的吃水果

         还是一样水果类不进行贴出来,下面就要关键是创建工厂这一类,

          //抽象出创建水果的工厂类,将创建真正实例的推到子类上
        //这样就不存在简单工厂的缺点,每次只需要子类增加就可以不需要在原来代码上做更改
        public abstract class CreateFruitFactory
        {
            public abstract Fruit CreateFruit();
        }

        public class CreateAppleFactory : CreateFruitFactory
        {
            public override Fruit CreateFruit()
            {
                return new Apple();
            }
        }

        public class CreateOrangeFruit : CreateFruitFactory
        {
            public override Fruit CreateFruit()
            {
                return new Orange();
            }
        }

         //工厂模式解决了简单工厂模式需要更改代码的问题
                //是不是这样就结束了尼,我们的程序的扩展性也好了各种都好了那还需要更改什么尼,假如我们又增加一种水果罐头,这样我们工厂模式就不适用了,那么又该怎么养去设计尼,接下来请听下回分解--抽象工厂
                CreateFruitFactory createApple = new CreateAppleFactory();
                Fruit apple = createApple.CreateFruit();
                apple.Eat();

                CreateFruitFactory createOrage = new CreateOrangeFruit();
                Fruit orange = createOrage.CreateFruit();
                orange.Eat();
                Console.ReadKey();

    三、GitHub

            https://github.com/wangtongzhou520/Designpattern

        

       

  • 相关阅读:
    js点击按钮为元素随机字体颜色和背景色
    js随即数字random实现div点击更换背景色
    while循环计算1-100和,1-100内偶数/奇数/被整除的数的和
    慕课手机展示页案例
    第3题:求子数组的最大和
    第4题:在二叉树中找出和为某一值的所有路径
    第5题:查找最小的K个元素
    Linux系统开启IPv6任播(anycast)地址
    第7题:判断两个链表是否相交
    第8题上:思维题
  • 原文地址:https://www.cnblogs.com/yujihaia/p/7468165.html
Copyright © 2011-2022 走看看