当前位置:网站首页>创建型模式 - 简单工厂模式StaticFactoryMethod
创建型模式 - 简单工厂模式StaticFactoryMethod
2022-08-02 21:43:00 【Xiaohei.Wang(Wenhao)】
简单工厂模式的定义
创建型模式:
我们把被创建的对象称为产品,把创建产品的对象称为工厂。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式。
在简单工厂模式中创建实例的方法通常为静态(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(记得备注),大家一起进步
今日无推荐
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
边栏推荐
- Learn more TypeScript 】 【 TypeScript modular
- SRv6网络演进面临的挑战
- The interviewer asked me: delete library, in addition to run do?
- 【使用pyside2遇到的问题】This application failed to start because no Qt platform plugin could be initialized.
- 源码构建LAMP环境-2
- # 医院管理系统完整项目代码以及数据库建表语句分享
- 【STM32学习2】存储器相关概念与操作
- I interviewed a 985 graduate, and I will never forget the expression when answering the "performance tuning" question
- 任务四 机器学习库Scikit-learn
- Ruoyi integrates minio to realize distributed file storage
猜你喜欢
随机推荐
在迁移测试中,源表、中间表、目标表的迁移规则
源码构建LAMP环境-2
手把手教你干掉if else
Teach you how to kill if else
wallys/new product/WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975
如何通过开源数据库管理工具 DBeaver 连接 TDengine
How many ways do you know the singleton pattern?
Abstract Factory Pattern
谷粒商城-day14-商城业务与压力测试
博客主题美化第二弹
一群搞社区的人
The interviewer asked me: delete library, in addition to run do?
字节内部技术图谱 惊艳级实用
微软SQL服务器被黑客入侵以窃取代理服务的带宽
You and I will meet the needs of: how to export the data in a MySQL simple ~!Practical!
H.265视频流媒体播放器EasyPlayer.js集成时出现“SourceBuffer ”报错,该如何解决?
成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘
以赛促练-力扣第304场周赛反思(持续更新中)
命令行启动常见问题及解决方案
In-depth study TypeScript TypeScript 】 【 class (under)



![[TypeScript] Deep Learning of TypeScript Classes (Part 1)](/img/47/34954f1e01b844816d74f3ac556f9b.png)





