源码:

源代码C#

系列导航:

目录

定义(Factory Pattern):

用来创建目标对象的类,将相似对象的创建工作统一到一个类来完成。

一、简单工厂模式:

代码:

    /// <summary>/// 产品枚举/// </summary>public enum ProductEnum{ConcreateProductA,ConcreateProductB}/// <summary>/// 简单工厂模式:/// 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。/// 不修改代码的话,是无法扩展的。(如果增加新的产品,需要增加工厂的Swith分支)/// 不符合【开放封闭原则】/// </summary>public static class SimpleFactory{public static AbstractCar Create(ProductEnum productType){switch (productType){case ProductEnum.ConcreateProductA:return new ConcreateCarA();case ProductEnum.ConcreateProductB:return new ConcreateCarB();default:return null;}}}
        /// <summary>/// 测试简单工厂模式/// </summary>private static void TestSimpleFactory(){Console.WriteLine("简单工厂模式:");var productA = SimpleFactory.Create(ProductEnum.ConcreateProductA);productA.GetInfo();Console.ReadLine();}

优缺点:

工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。对于客户端来说,去除了对具体产品的依赖。
不符合【OCP】。

应用场景:

当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式。


二、反射工厂模式(基于简单工厂模式的拓展)

通过反射,以完成工厂对对象的创建。可以最大限度的解耦。

代码:

    /// <summary>/// 反射工厂模式/// 是针对简单工厂模式的一种改进/// </summary>public static class ReflectFactory{public static AbstractCar Create(string typeName){Type type = Type.GetType(typeName, true, true);var instance = type?.Assembly.CreateInstance(typeName) as AbstractCar;return instance;}}
        /// <summary>/// 测试反射工厂模式/// </summary>private static void TestReflectFactory(){Console.WriteLine("反射工厂模式:");var productB = ReflectFactory.Create("FactoryPattern.ConcreateCarB");productB.GetInfo();Console.ReadLine();}

PS:反射工厂模式可以和配置文件配合使用,效果更佳


三、工厂方法模式

定义:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法将类的实例化延长到子类。

类图:

启示:

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。

代码:

    /// <summary>/// 工厂方法模式:/// 工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。/// 在同一等级结构中,支持增加任意产品。/// 符合【开放封闭原则】,但随着产品类的增加,对应的工厂也会随之增多/// </summary>public interface IFactoryMethod{AbstractCar Create();}public class ConcreateFactoryA:IFactoryMethod{public AbstractCar Create(){return new ConcreateCarA();}}public class ConcreateFactoryB : IFactoryMethod{public AbstractCar Create(){return new ConcreateCarB();}}
        /// <summary>/// 测试工厂方法模式/// </summary>private static void TestFactoryMethod(){Console.WriteLine("工厂方法模式:");IFactoryMethod factoryB =new ConcreateFactoryB();var productB = factoryB.Create();productB.GetInfo();Console.ReadLine();}

优缺点:

符合【OCP】,但随着产品类的增加,对应的工厂类也会随之增多。
工厂方法模式实现时,客户端需要决定实例化哪个工厂来创建对象。工厂方法把简单工厂的内部创建对象的逻辑判断移到了客户端。如果需要修改,只需要修改客户端即可!

应用场景:

单一产品的创建。


三、抽象工厂模式

定义:

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。

类图:

启示:

抽象工厂是应对产品族概念的,比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

代码:

    /// <summary>/// 抽象工厂模式:/// 抽象工厂是应对产品族概念的,比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。/// 应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。/// </summary>public interface IAbstractFactory{AbstractCar CreateCar();AbstractBus CreateBus();}/// <summary>/// 宝马工厂/// </summary>public class BMWFactory:IAbstractFactory{public AbstractCar CreateCar(){return new ConcreateCarA();}public AbstractBus CreateBus(){return new ConcreateBusA();}}/// <summary>/// 比亚迪工厂/// </summary>public class BYDFactory : IAbstractFactory{public AbstractCar CreateCar(){return new ConcreateCarB();}public AbstractBus CreateBus(){return new ConcreateBusB();}}
/// <summary>/// 测试抽象工厂模式/// </summary>private static void TestAbstractFactory(){Console.WriteLine("抽象工厂模式:");var bmwFactory = new BMWFactory();bmwFactory.CreateCar().GetInfo();bmwFactory.CreateBus().GetInfo();var bydFactory = new BYDFactory();bydFactory.CreateCar().GetInfo();bydFactory.CreateBus().GetInfo();Console.ReadLine();}

优缺点:

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

应用场景:

一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
这个系统有多个系列产品,而系统中只消费其中某一系列产品
系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。


总结:

简单工厂:简单实用,但违反开放封闭;
工厂方法:开放封闭,单一产品;
抽象工厂:开放封闭,多个产品;
反射工厂:可以最大限度的解耦。

创建相似对象,就交给『工厂模式』吧相关推荐

  1. 牵线搭桥,『桥接模式』

    目录:设计模式之小试牛刀 源码路径:Github-Design Pattern 定义:(Bridge Pattern) 将抽象和实现解耦,使得两者可以独立地变化. 类图: 启示: 一个产品的研发,流程 ...

  2. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  3. 设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式

    AbstractFactory抽象工厂模式(创建型) 作用: 这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的.抽象工厂被具体化成不同的工厂来创建类似产品的不同产品.这种模式将类于使 ...

  4. Java反射生成对象注入spring(结合工厂模式)

    利用工厂模式进行代码扩展,而不用修改原来代码.在配置文件配置要生成的类,通过反射交由工厂生成对象,并将此对象交给spring管理,在项目中遇到此问题并予以解决,做一下记录. package cn.ea ...

  5. 类与对象作业(简单工厂模式)

    一.自助饮品系统(作业要求) 二.代码内容 1.代码逻辑关系 2.饮品,Coco类 package naicha;import java.util.Scanner;/*** @Auther: Mujy ...

  6. 这一次数据说了算,『访问者模式』

    定义:(Visitor Pattern) 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 换句话说: 访问者模式赋予了[数据]的选择权. 一般 ...

  7. 设计模式之策略模式+工厂模式+模板模式结合

    设计模式之策略模式+模板模式 为什么总是学不好设计模式 从"登录功能"中发现问题. 首先我们简单的了解功能需求: 于是你开始干活了: 1.控制层代码如下,根据不同的登录方式调用不同 ...

  8. 二十三种设计模式第二篇--工厂模式

    上篇我们了解了6条设计模式的准则,我相信如果你想了解设计模式,那么你迈出的第一步,我会将上一篇文档里边的6大准则进行一篇有关的代码展示,当然这是题外话了,本篇我们将重点围绕工厂模式进行讲解,天哪,23 ...

  9. 设计模式之工厂模式详解(附应用举例实现)

    文章目录 1 工厂模式介绍 2 工厂模式详解 2.1 简单工厂模式 2.1.1 简单工厂模式结构 2.1.2 简单工厂模式实现 2.1.3 简单工厂模式应用举例 2.2 工厂方法模式 2.2.1 工厂 ...

最新文章

  1. 基于C#的UDP协议的同步实现
  2. 一条SQL语句实现二进制到十进制的转换
  3. 计算机专业i7 7500u,8550U比7500U提升多少 8550U和7500U的区别-太平洋电脑网
  4. PowerDesigner生成注释以及对应数据库的sql语句
  5. HikariCP-史上最快速的连接池
  6. 在读博士练成健身达人,女大学生在宿舍练出八块腹肌……
  7. 别人在忙挖矿,京东架构师却悄悄用区块链搞了件大事
  8. 打造优秀B端产品需求分析流程要点
  9. nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)
  10. keil接收别人发的工程打不开_STM32工程模板建立之 KEIL 开发平台设置(一)
  11. SSRS里面的if else表达式 和决策函数
  12. 原型万事通,你想知道(但不敢问)的都在这里
  13. ARM处理器的9种模式详解
  14. 赵鹏的《大师之路》教程
  15. Git基础-git恢复被删除的文件
  16. 百度3D地图API的调用以及适应过程
  17. 开箱-艳云脚本云控系统
  18. 利用计算机进行信息管理,浅论如何利用计算机软件技术进行信息管理
  19. 第六期:如何通过知晓云将数据表导出为 Excel 文件
  20. 使用ip小魔棒让外部网络访问内网中的资源

热门文章

  1. ubuntu设置静态ip
  2. NGINX生命周期-转
  3. POJ2243 Knight Moves —— A*算法
  4. python学习之路(九)
  5. 求数组中的最小子数组,时间复杂度o(n),java
  6. C#中NULL,,DBNULL,String.Empty,Convert.IsDBNull()的区别
  7. 下滑加载更多js_专治:卫生间免砸砖,房顶漏水,JS堵漏王水不漏,厂家三包产品,免费成熟配方(点开看更多)...
  8. 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)
  9. 基于wemos D1的无线遥控灯(433m无线模块)
  10. 全国计算机等级考试题库二级C操作题100套(第96套)