当前位置:网站首页>创建型模式 - 简单工厂模式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之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
边栏推荐
猜你喜欢

从月薪10k到30k的必走之路:自动化测试

What is the core business model of the "advertising e-commerce" that has recently become popular in the circle of friends, and is the advertising revenue really reliable?

最近火爆朋友圈的“广告电商”,核心商业模式是什么,广告收入真实靠谱吗?

LeetCode 2359. 找到离给定两个节点最近的节点 基环树

Teach you how to kill if else

抽象工厂模式

H.265视频流媒体播放器EasyPlayer.js集成时出现“SourceBuffer ”报错,该如何解决?

UDP(用户数据报协议)

YAML文件格式

Add and delete all these years, finally planted in MySQL architecture design!
随机推荐
宝塔搭建实测-基于ThinkPHP5.1的wms进销存源码
golang刷leetcode: 在每个树行中找最大值
CS5213芯片|HDMI to VGA转换头芯片资料分享
Win10怎么开启自带的游戏录屏功能?
js函数防抖和函数节流及其他使用场景
wallys/new product/WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975
多租户的多种实现方案
win10桌面图标全部变成白色的怎么办
Flink-SQL
2022-08-02 第六小组 瞒春 学习笔记
golang刷leetcode:使数组按非递减顺序排列
【DEBUG】ImportError: Unable to import required dependencies: numpy: DLL load failed: 找不到指定的模块。
iptables、firewalld的使用
测试ESP32-Zigbee转发命令 : 滑轨、继电器控制
matplotlib绘图的核心原理讲解(超详细)
若依如何实现添加水印功能
js function anti-shake and function throttling and other usage scenarios
第十章 时序与延迟
在迁移测试中,源表、中间表、目标表的迁移规则
go context 包