前言

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

  简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。例如:计算器,只需要把“+”、“-”等给客户端,然后传入工厂,工厂就自动给出了相应的实例,但问题就这里,如果添加一个“*”的功能,我们一定要给工厂类的方法加‘case’判断的,修改原有的类?这就违背了开-闭原则。

1、公共类

  

     /// <summary>
/// 这个人会挣钱,会开公司,男人,女人都要学习
/// </summary>
public class MaYun
{
public void Money()
{
Console.WriteLine("挣钱");
}
public void Company()
{
Console.WriteLine("开公司"); }
}
     public class Man : MaYun
{ }
public class Woman : MaYun
{ }

二、简单工厂

  工厂类:

  public class SimpleFactory
{
public static MaYun CreateMaYun(string type)
{
MaYun m = null;
switch (type)
{
case "Man":
m = new Man();
break;
case "Woman":
m = new Woman();
break;
default:
break; }
return m;
}
}

  客户端:

     class Program
{
static void Main(string[] args)
{
#region 简单工厂
MaYun man1 = SimpleFactory.CreateMaYun("Man");
man1.Money();
man1.Company();
MaYun woman1 = SimpleFactory.CreateMaYun("Woman");
woman1.Money();
woman1.Company();
#endregion
}
}

三、工厂

  定义工厂接口,并让男人的工厂和女人的工厂类继承该接口

  public interface  IFactory
{
MaYun CreateMaYun();
}
public class ManFactory : IFactory
{
public MaYun CreateMaYun()
{
return new Man();
}
}
public class WomanFactory : IFactory
{
public MaYun CreateMaYun()
{
return new Woman();
}
}

  客户端:

     class Program
{
static void Main(string[] args)
{ #region 工厂
//要修改为woman,只需修改 IFactory factory = new WoManFactory();
IFactory factory = new ManFactory();
MaYun mm = factory.CreateMaYun();
mm.Company();
mm.Money();
#endregion
}
}

总结:

  1、尽管如果换成‘woman类’或者其他子类,还是要修改代码的,但只需要修改一处就可以了。

  2、工厂模式克服了简单工厂违背开-闭原则的缺点,又保持了封装对象创建过程的优点。

  参考书籍:大话设计模式

工厂模式vs简单工厂的更多相关文章

  1. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

  2. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  4. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  5. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...

  6. 设计模式之工厂模式之简单工厂(php实现)

    github源码地址: git@github.com:ZQCard/design_pattern.git 1.简单工厂模式 特点:将调用者与创建者分离,调用者直接向工厂请求,减少代码的耦合.提高系统的 ...

  7. Objective-C 工厂模式(上) -- 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  8. factory工厂模式之简单工厂SimpleFactory

    简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.1.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.2.或者针对每个产品, ...

  9. c# 设计模式 之:工厂模式之---简单工厂

    1.uml类图如下: 具体实现和依赖关系: 实现:SportCar.JeepCar.HatchbackCar 实现 Icar接口 依赖: Factory依赖 SportCar.JeepCar.Hatc ...

  10. JAVA 工厂模式:简单工厂

    简单工厂模式(SimpleFactory Pattern): 又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的 ...

随机推荐

  1. moongoose对象无法新增删除属性

    昨天用nodes中的moongoose去查询一个结果遇到一个大坑,这个坑貌似用moongoose可能会遇到.背景是这样的,我在nodejs中去查询document,得到的可以看作是一个对象list.在 ...

  2. C#/.NET VS2017+ EF+SQLite.CodeFirst——真正实现CodeFirst

    本文所介绍的是真正的EF+CodeFirst,不需要提前建表,由代码自动生成! 进行前需要准备的: 1.下载Sqlite Experthttp://www.sqliteexpert.com/downl ...

  3. PyQt5+qtdesigner开发环境配置

    1.PyQt5安装 pip install PyQt5 2.qtdesigner安装 本来直接用pip install PyQt5-tools安装的,但是网速下的慢,中间还断了几次,在网上找到一个稳定 ...

  4. git 使用远程分支覆盖本地分支(重置本地分支)

    1 丢弃本地变更 重置为远端分支内容 git reset --hard origin/branchName 如 git reset --hard origin/F_AssetItem

  5. git 操作遇到的问题与解决方法

    一.使用git在本地创建一个项目的过程,Git 上传本地文件到github $ makdir ~/hello-world //创建一个项目hello-world $ cd ~/hello-world ...

  6. SOAP、WSDL、 UDDI之间的关系

    SOAP(Simple Object Access Protocol) 简单对象访问协议: WSDL(Web Services Description Language) Web服务描述语言: UDD ...

  7. 在 CentOS 上部署 GitLab (自托管的Git项目仓库)

    参考资料https://github.com/mattias-ohlsson/gitlab-installer/blob/master/gitlab-install-el6.sh 环境准备OS: Ce ...

  8. JS占位符替换

    String.prototype.format = function() { if(arguments.length === 0) return this; var obj = arguments[0 ...

  9. js数组声明+split()方法

    split()方法:var words = sentence.split(' '): "hello".split("", 3) //可返回 ["h&q ...

  10. python 使用xlsxwriter的方法属性

    http://xlsxwriter.readthedocs.io/format.html