一、工厂模式的介绍

      工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用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

23种设计模式--工厂模式-Factory Pattern的更多相关文章

  1. 设计模式 - 工厂模式(factory pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...

  2. 23种设计模式--建造者模式-Builder Pattern

    一.建造模式的介绍       建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...

  3. 【设计模式】工厂模式 Factory Pattern

    1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...

  4. 设计模式 - 出厂模式(factory pattern) 详细说明

    出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...

  5. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  6. JAVA设计模式之工厂模式—Factory Pattern

    1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...

  7. 创建型模式篇(工厂模式Factory Pattern)

    一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...

  8. [设计模式]工厂模式factory

    参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...

  9. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

随机推荐

  1. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter

    “.Net 社区虚拟大会”(dotnetConf) 2016 今天凌晨在Channel9 上召开,在Scott Hunter的30分钟的 Keynote上没有特别的亮点,所讲内容都是 微软“.Net社 ...

  2. 使用Visual Studio SDK制作GLSL词法着色插件

    使用Visual Studio SDK制作GLSL词法着色插件 我们在Visual Studio上开发OpenGL ES项目时,避免不了写Shader.这时在vs里直接编辑shader就会显得很方便. ...

  3. 漫扯:从polling到Websocket

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...

  4. jsp前端实现分页代码

    前端需要订一page类包装,其参数为 private Integer pageSize=10; //每页记录条数=10 private Integer totalCount; //总记录条数 priv ...

  5. CSS float 浮动属性

    本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式:介绍文档流.浮动层以及float属性. 2. float:left :介绍float为 left 时的布局方式. 3. ...

  6. CentOS7 重置root密码

    1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...

  7. atitit.细节决定成败的适合情形与缺点

    atitit.细节决定成败的适合情形与缺点 1. 在理论界有两种观点:一种是"细节决定成败",另一种是"战略决定成败".1 1.1. 格局决定成败,方向决定成败 ...

  8. ubuntu15.04 nginx1.6.5 配置虚拟主机

    1 在/etc/hosts   添加host 2 在/etc/nginx/nginx.conf中查看http里的include ****** /*.conf的路径,在此路径下添加一个新的******. ...

  9. Intelli IDEA 设置项目编码(Mac)

    Intelli IDEA->Editor->File Encodings

  10. [转]nopCommerce Widgets and How to Create One

    本文转自:https://dzone.com/articles/what-are-nopcommerce-widgets-and-how-to-create-one A widget is a sta ...