在设计模式当中有三大工厂,分别是 简单工厂抽象工厂工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现。

简单工厂一般由以下几个对象组成:

对象 作用
工厂类 负责创建产品
抽象产品类 工厂创建出来的产品抽象
具体产品类 继承自抽象产品类,具体的产品功能

那么我们为什么不直接 new 一个对象来执行操作呢?如果有以下代码:

public class BusinessClass
{
public void Process()
{
Car _car = new Car();
_car.Run();
}
}

这么写的话,一旦我们业务逻辑发生变化,我不想创建 Car 对象了,我想创建一个 AirPlane 对象,他也具有 Run 方法,这个时候这种写法就很尴尬了,我需要在后面加一个 AirPlane air = new AirPlane() 然后再 Run。

而工厂模式则将创建与使用分离开来,用户不用关心怎么创建的,只需要告诉工厂你需要哪种类型的对象,我给你创建好,你直接调用即可。乍一看来没有什么改变,但之前直接 new 对象的方式则造成 BusinessClass 对于 Car 等对象造成了一种依赖关系。

换句话说,如果按照上面那种方式书写,BusinessClass 则是依赖于 Car 对象的,而简单工厂则是降低对象之间的耦合度(依赖)的。

在上面的例子中,我们要封装他们的改变,他们之间改变的地方在于实例的创建,那么我们封装之后就由工厂来进行创建,便有以下代码:

抽象产品类:

public abstract class Product
{
void Run();
}

再有一个工厂类:

public static class Factory
{
public static Product CreateInstance(string type)
{
switch(type)
{
case "Car":
return new Car();
case "AirPlane":
return new AirPlane();
default:
return null;
}
}
}

有了工厂类,我们再来定义两个具体的实现类:

public class Car : Product
{
public override void Run()
{
Console.WriteLine("这是汽车");
}
}
public class AirPlane : Product
{
public override void Run()
{
Console.WriteLine("这是飞机");
}
}

之后我们再改一下刚才的 BusinessClass:

public class BusinessClass
{
public void Process()
{
Product car = Factory.CreateInstance("Car");
car.Run();
Product air = Factory.CreateInstance("AirPlane");
air.Run();
}
}

这里其实我们也察觉了,如果我们每增加一个具体的产品,那么我们的工厂方法逻辑也会越来越臃肿,而且工厂类一点不能正常运行,就

会造成灾难性的后果。

简单工厂仅适用于工厂类负责创建的对象,较少的话对于工厂类的逻辑也不会太复杂。而且用户仅需要知道传入工厂类的参数即可创建对象,用户不需要具体的创建过程。

[C#]设计模式-简单工厂-创建型模式的更多相关文章

  1. [C#]设计模式-抽象工厂-创建型模式

    介绍了简单工厂与工厂方法之后,现在我们来看一下工厂三兄弟的最后一个 -- 抽象工厂. 那什么是抽象工厂呢? 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相 ...

  2. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  3. 初探Java设计模式1:创建型模式(工厂,单例等)

    Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...

  4. 设计模式(一)简单工厂(创建型)(Java&&PHP)

    面向对象设计的基本原则 单一职责系统中的每一个对象应该只有一个单独的职责,所有对象关注的应该是自身职责的完成. 基本思想:高内聚,低耦合. 开闭原则一个对象对扩展开放,对修改关闭.基本思想:对类的改动 ...

  5. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  6. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

    创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...

  7. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  8. C++ 设计模式 2:创建型模式

    0 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活. 1 简单工厂模式 简单 ...

  9. Java设计模式 - 单例模式(创建型模式)

    单例模式我在上学期看一些资料时候学习过,没想到这学期的软件体系结构就有设计模式学习,不过看似篇幅不大,介绍得比较简单,在这里我总结下单例模式,一来整理之前的笔记,二来也算是预习复习课程了. 概述 单例 ...

随机推荐

  1. 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程

    授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...

  2. 程序猿媛 九:Adroid zxing 二维码3.1集成(源码无删减)

    Adroid zxing 二维码3.1集成 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段. 转载请保留原文出处“http://my.oschina.net/gluoyer/blog”, ...

  3. 数据库数据带&符号 导入有问题的处理办法

    在sql文件头部加个: set feedback off set define off   我们在plsql里面将一条语句导出时会出现以下结果(测试表t_test): prompt Importing ...

  4. Suricata默认规则集相关

    Suricata规则集 Suricata 基于规则检测和控制数据流量,所有规则的配置文件保存在rules目录内 .这些是已知和确认的活动僵尸网络和其C&C(command and contro ...

  5. JavaEE GenericServlet 解析

    从 上一篇 文章中可以看到,直接实现 Servlet 接口需要实现其所有方法,而这通常不是好的做法.相反,一种相对较好的做法是给出一个实现类来默认实现其所有方法或者部分方法,并开放给子类.而子类再在此 ...

  6. ES5和ES6两个值的比较

    ES5比较两个值是否相等 1)相等运算符 (==):比较两个数值是否相等,自动转换类型后再进行比较 2)全等运算符(===):比较两个比较值的数值和类型是否相等 ES5的特殊: ES6提出" ...

  7. 贯穿程序员一生的必备开发技能——debug

    1.什么是debug debug是一种运行模式,用来跟踪程序的走向,以及跟踪程序运行过程中参数的值的变化. 2.debug的作用 debug一般用来跟踪代码的运行过程,通常在程序运行结果不符合预期或者 ...

  8. C语言博客作业--函数

    一.PTA实验作业 题目1 (6-7) (1).本题PTA提交列表 (2)设计思路 设计第一个函数判断是否完数int factorsum( int number ) 定义sum.i:sum初始化归0, ...

  9. 【Alpha版本】冲刺阶段 - Day4 - 加速

    今日进展 袁逸灏:实现音乐的播放.(5h) 启动类,游戏画面类(修改类) 刘伟康:继续借鉴其他 alpha 冲刺博客,了解了Android方面的部分内容,便于更好地推进进度.(2h) 刘先润:更新图画 ...

  10. C语言——第三次作业

    题目1.A乘以B 1.实验代码 #include <stdio.h> int main() { int A,B,C; scanf("%d %d",&A,& ...