简单工厂模式
工厂模式分为三种
简单工厂模式是这三种中最简单的,也是后两种的基础。
简单工厂模式不在 GoF 那 23 种设计模式当中
工厂模式定义:建立一个创建产品的工厂接口,通过工厂来进行相关产品的创建,从而达到 创建和实现分离 的目的。
其中简单工厂模式也被称为静态工厂。主要原因就是它提供了一个静态的创建接口。
结构
简单工厂结构:
? 工厂类 ?
SimpleFactory
+MakeProduce() : Prouduct
?抽象产品类?
Product
+Fun1() : void
+Fun2() : void
ConcreteProduct1
+Fun1() : void
+Fun2() : void
ConcreteProduct2
+Fun1() : void
+Fun2() : void
?调用端?
Client
类图中横线为静态方法,斜线为抽象方法
由于简单工厂模式结构简单,我们就不多做说明了。
实现 - Unity
类图 和 代码 一并展示,方便大家理解
?抽象技能类?
Skill
+Release() : void
Skill1
+Release() : void
Skill2
+Release() : void
Skill3
+Release() : void
?工厂类?
SkillFactory
+MakeSkill(SkillType skillType) : Skill
?枚举?
SkillType
Skillone
Skilltwo
SkillThree
技能类(产品)
public abstract class Skill
{
public abstract void Release();
}
public class Skill1 : Skill
{
public override void Release()
{
Debug.Log("释放技能1");
}
}
public class Skill2 : Skill
{
public override void Release()
{
Debug.Log("释放技能2");
}
}
public class Skill3 : Skill
{
public override void Release()
{
Debug.Log("释放技能3");
}
}
技能工厂
public class SkillFactory
{
public enum SkillType
{
Skillone,
Skilltwo,
Skillthree,
}
public static Skill MakeSkill(SkillType skillType) =>
skillType switch
{
SkillType.Skillone => new Skill1(),
SkillType.Skilltwo => new Skill2(),
SkillType.Skillthree => new Skill3(),
_ => throw new System.Exception("没有相关技能类型"),
};
}
调用端
public class SimpleFactoryExample1 : MonoBehaviour
{
private void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
{
SkillFactory.MakeSkill(SkillFactory.SkillType.Skillone).Release();
}
else if (Input.GetKeyDown(KeyCode.W))
{
SkillFactory.MakeSkill(SkillFactory.SkillType.Skilltwo).Release();
}
else if (Input.GetKeyDown(KeyCode.E))
{
SkillFactory.MakeSkill(SkillFactory.SkillType.Skillthree).Release();
}
}
}
通过工厂模式将产品的 创建 和 实现 分离,防止调用端对产品的创建,产品的扩展影响到调用端,导致违背开闭原则。
利与弊
优点
- 调用端不在影响产品的创建
- 职责分明 - 工厂创建产品,产品实现功能
- 封装性强,客户端只需和工厂打交道即可获得相关产品
缺点
- 简单工厂产品单一,如果产品过多,会造成工厂类代码臃肿,违背高内聚。
- 多个产品所需要的不同的工厂,会造成工厂类不断增多,使得系统复杂度增加。
- 工厂类扩展性较差,当有新的产品需要扩展时,需要修改工厂类的内部代码
当产品较少的情况下,使用简单工厂模式,可以方便我们快速实现,当产品过多,我们应该考虑使用 工厂方法 或 抽象工厂 模式。 😮
|