简单工厂模式的定义

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

简单工厂模式中创建实例的方法通常为静态(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. Mysql之PXC高可用

    PXC高可用 1.环境准备 pxc1: centos7 10.0.0.7 pxc2: centos7 10.0.0.17 pxc3: centos7 10.0.0.27 pxc4: centos7 1 ...

  2. JS逆向实战6-- x轴 y轴 过点触验证码

    点触验证码是一种常见的反爬手段 解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间的对应关系. 这 ...

  3. redis的几个优化点

    1. redis读写速度慢 可以将redis单实例改为redis集群 2. redis报OOM redis内存溢出,调大redis内存:增加redis.conf中的maxmemory 的值.如果red ...

  4. python安装request及更新pip

    今天在python中安装request模块时遇到了问题 爆出一大堆警告 最主要的是下面的 这里的解决方法就是更新pip: 直接使用系统给的pip升级指令好像不行 百度搜了一下,有两步 1.在C:\Py ...

  5. 重新认识下JVM级别的本地缓存框架Guava Cache(2)——深入解读其容量限制与数据淘汰策略

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 通过<重新认识下JVM级别的本地 ...

  6. c++ const和指针

    const int *p: 定义指针,指向的变量的值不能修改(指向整型常量或普通整型,但值不能通过指针修改) int const *p: 同上 int * const p=&a: 一直指向a, ...

  7. vue3 第二天vue响应式原理以及ref和reactive区别

    前言: 前天我们学了 ref 和 reactive ,提到了响应式数据和 Proxy ,那我们今天就来了解一下,vue3 的响应式 在了解之前,先复习一下之前 vue2 的响应式原理 vue2 的响应 ...

  8. VMware宿主机访问虚拟机的Web服务

    VMware宿主机访问虚拟机的Web服务,主要就是宿主机可以通过IP能够访问到虚拟机. 可以尝试使用以下步骤. 1.关闭虚拟机,把网络连接方式修改成桥接方式. 2.打开虚拟机后,把虚拟机的防火墙关闭. ...

  9. Datawhale组队学习_Task03:详读西瓜书+南瓜书第4章

    第4章 决策树 4.1 基本流程 #输入:训练集D={${(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}$}; #属性集A=${{a_1,a_2,...,a_d}}$. #过程: ...

  10. 【Java SE】Day02 数据类型转换、运算符、方法入门

    一.数据类型转换 1.自动转换 取值范围小在运算时会提升为取值范围大的类型 byte+int=int int+double=double 转换规则:byte.short.char-->int-- ...