当前位置:网站首页>创建型模式 - 简单工厂模式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之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
边栏推荐
猜你喜欢
Command line startup FAQs and solutions
【使用pyside2遇到的问题】This application failed to start because no Qt platform plugin could be initialized.
行业 SaaS 微服务稳定性保障实战
LeetCode 2359. 找到离给定两个节点最近的节点 基环树
How to seize the new trend of NFT, yuan|universe|universe?
双轴晶体中的锥形折射
Task 4 Machine Learning Library Scikit-learn
【TypeScript】深入学习TypeScript类(上)
win10安全中心设置不扫描某个文件夹的方法
Byte's internal technical map is amazing and practical
随机推荐
以赛促练-力扣第304场周赛反思(持续更新中)
如何抓住NFT、元|宇|宙新趋势?
Zabbix 5.0 Monitoring Tutorial (2)
【使用pyside2遇到的问题】This application failed to start because no Qt platform plugin could be initialized.
H5网页播放器EasyPlayer.js播放器界面的加载效果无法消失是什么原因?
[c] Detailed explanation of operators (1)
面试官:可以谈谈乐观锁和悲观锁吗
Summary of @Transactional transaction invocation and effective scenarios
golang刷leetcode: 小于等于 K 的最长二进制子序列
【Unity】Unity开发进阶(七)双刃剑:扩展方法
总数据量超万亿行,玉溪卷烟厂通过正确选择时序数据库轻松应对
若依如何实现添加水印功能
Auto.js实现朋友圈自动点赞
JS 包装类 Math对象 round max() min() random
Go语言如何操作文件
Interviewer: can you talk about optimistic locking and pessimistic locks
树形结构构造示例代码
iptables、firewalld的使用
Flink优化的方方面面
matplotlib绘图的核心原理讲解(超详细)