当前位置:网站首页>创建型模式 - 简单工厂模式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之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
边栏推荐
猜你喜欢
随机推荐
微软SQL服务器被黑客入侵以窃取代理服务的带宽
The interviewer asked me: delete library, in addition to run do?
成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘
IP Protocol (Internet Protocol)
Software testing pen questions 1 (with answers)
不堪哥哥殴打谩骂,妹妹申请人身安全保护令获支持
快速学会ansible的安装
你离「TDengine 开发者大会」只差一条 SQL 语句!
JS 包装类 Math对象 round max() min() random
CS5213 chip | HDMI to VGA converter chip data sharing
Redis是如何轻松实现系统秒杀的?
go context 包
【DEBUG】ImportError: Unable to import required dependencies: numpy: DLL load failed: 找不到指定的模块。
H.265视频流媒体播放器EasyPlayer.js集成时出现“SourceBuffer ”报错,该如何解决?
[TypeScript] Deep Learning of TypeScript Classes (Part 1)
Finally understand: With threads, why do we need coroutines?
Auto.js脚本程序打包
刚安装完win10专业工作站版,系统变量中Path默认值有哪些?重新建一个“PATH”变量名,会覆盖掉原先的“Path”。
golang刷leetcode: 卖木头块
Ansible installation and configuration