简单工厂模式的定义

        创建型模式:
        
我们把被创建的对象称为产品,把创建产品的对象称为工厂。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式

简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)

简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了开闭原则


简单工厂模式的优点

  • 工厂类包含必要的判断逻辑、可以决定在什么时候创建哪一个产品的实例。调用时可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确
  • 调用时无需知道所创建具体产品的类名,只需要知道参数即可
  • 可以引入配置文件,在不修改调用端代码的情况下变更和增加新的产品类

简单工厂模式的缺点

  • 简单工厂模型的工厂类单一,负责所有产品的创建,职责过重,一旦异常,则整个系统都将受到印象。且代码非常臃肿、违背了高内聚
  • 每引入一个新工厂类,都会增加系统的类的个数,这样会增加复杂度,以及维护的理解难度
  • 系统扩展困难,一旦新增产品就不得不修改工厂逻辑,当产品类较多时,则造成逻辑过于复杂
  • 简单工厂使用了static关键字,这样会造成工厂角色无法形成继承的等级结构

应用场景

对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

简单工厂模式:

//简单工厂
public static void SimpleFactoryTest()
{
Word a = SimpleFactory.GetWord("A");
Word b = SimpleFactory.GetWord("B");
Word c = SimpleFactory.GetWord("C");
a.Name();
b.Name();
c.Name();
} namespace StudyDesignMode.Factory
{
public sealed class SimpleFactory
{
public static Word GetWord(string wordName)
{
switch (wordName)
{
case "A":
return new A();
case "B":
return new B();
case "C":
return new C();
default:
return null;
}
}
} public abstract class Word{ public abstract void Name(); } public class A : Word{public override void Name(){ Console.WriteLine("我是A"); }}
public class B : Word{public override void Name(){ Console.WriteLine("我是B"); }}
public class C : Word{public override void Name(){ Console.WriteLine("我是C"); } }
}

工厂方法模式

public static void MethodFactoryTest()
{
Word a = new AFactory().GetWord();
Word b = new BFactory().GetWord();
Word c = new CFactory().GetWord();
Word d = new DFactory().GetWord();
a.Name();
b.Name();
c.Name();
d.Name();
} namespace StudyDesignMode.Factory
{
public interface IName
{
Word GetWord();
}
public class AFactory : IName
{
public Word GetWord()
{
return new A();
}
}
public class BFactory : IName
{
public Word GetWord()
{
return new B();
}
}
public class CFactory : IName
{
public Word GetWord()
{
return new C();
}
}
public class DFactory : IName
{
public Word GetWord()
{
return new D();
}
} public class A : Word { public override void Name() { Console.WriteLine("我是A"); } }
public class B : Word { public override void Name() { Console.WriteLine("我是B"); } }
public class C : Word { public override void Name() { Console.WriteLine("我是C"); } }
public class D : Word { public override void Name() { Console.WriteLine("我是D"); } } }

希望大家:点赞,留言,关注咯~

唠家常

  • Xiaohei.Wang(Wenhao)的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加Xiaohei.Wang(Wenhao)的QQ:841298494(记得备注),大家一起进步

今日无推荐

创建型模式 - 简单工厂模式StaticFactoryMethod的更多相关文章

  1. PYTHON设计模式,创建型之简单工厂模式

    这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...

  2. 创建型模式(过渡模式) 简单工厂模式(Simple Factory)

    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...

  3. JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式

    上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...

  4. Java设计模式之工厂模式(简单工厂模式+工厂方法模式)

    摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...

  5. js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象

    1.Factory基本写法 <!DOCTYPE html><html lang="en"><head>    <meta charset= ...

  6. Java模式—简单工厂模式

    简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...

  7. 抽象工厂模式&简单工厂模式

    抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...

  8. 关于js的对象创建方法(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)

    // 1.工厂方式创建对象:面向对象中的封装函数(内置对象) 简单来说就是封装后的代码,简单的工厂模式是很好理解的,关于它的作用,就是利用面向对象的方法,把一些对象封装,使一些占用空间多的,重复的代码 ...

  9. 创建型设计模式之工厂模式(Abstract Factory)

    结构            意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性     一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...

随机推荐

  1. 如何在Spring Boot开启事务

    说到事务,那什么是事务呢? 事务(Transaction),一般是指要做的或所做的事情. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行. ...

  2. 华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动

    11月4日,HDC2022华为开发者大会在东莞松山湖举办.在本次大会的HMS Core创新图形能力分论坛中,HMS Core重点介绍了其在3D技术领域的创新应用方向,其中3D建模服务展示了创新的自动骨 ...

  3. MYSQL ---mysql 数据导入与导出

    1.使用SQLyog导出MySQL中的数据库 打开SQLyog → 右击你想要保存的数据库 → 选择"Backup/Export"→ 选择"Backup Database ...

  4. linux下进程的实际用户ID(有效组)和有效用户ID(有效组ID)

    实际用户ID(实际组ID):标识当前用户(所属组)是谁,当用户登陆时取自口令文件. 有效用户ID(有效组ID):用来决定我们(当前进程)对文件的访问权(即实际该进程的是以那个用户运行的). 一般情况下 ...

  5. 【云原生 · Kubernetes】部署 kube-proxy 组件

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying kube-proxy 运行在所有 worker 节点上,它监听 apiserver 中 se ...

  6. 【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」

    日志追踪 日志追踪对于功能问题的排查和数据流转的路径分析时非常重要的,有了全链路日志追踪体系机制可以非常有效且快速的定位问题,但在多线程环境中,若没有相关成熟的框架的支持,想要实现日志追踪,就需要手动 ...

  7. 【DL论文精读笔记】Image Segmentation Using Deep Learning: A Survey 图像分割综述

    深度学习图像分割综述 Image Segmentation Using Deep Learning: A Survey 原文连接:https://arxiv.org/pdf/2001.05566.pd ...

  8. Excel2010工作簿被锁定,无法复制或者新增加sheet表格。

    Sub 工作簿密码破解() ActiveWorkbook.Sheets.Copy For Each sh In ActiveWorkbook.Sheets sh.Visible = True Next ...

  9. CSS中和颜色及渐变

    CSS可以设置的颜色 颜色名称 transparent(全透明黑色) pink yellowgreen 等指定的颜色名称 16进制 #ABCDEF 参数 含义 范围 AB 红色渠道值 00-FF CD ...

  10. 记一次InputStream流读取不完整留下的惨痛教训

    前言 首先,问问大家下面这段流读取的代码是否存在问题呢? inputStream = .... try { // 根据inputStream的长度创建字节数组 byte[] arrayOfByte = ...