设计模式之工厂模式(Factory Pattern)

一、工厂模式(Factory Pattern)简介

工厂模式又叫工厂方法模式(Factory Method),也叫"虚拟构造器模式"或"多态工厂模式
"。工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现"开闭原则",实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。它是一种创建型模式。

工厂方法模式和抽象工厂模式的区别:https://blog.csdn.net/Victor_Li_/article/details/122860338?spm=1001.2014.3001.5501

二、工厂模式(Factory Pattern)的优点

①符合单一职责原则,每个具体工厂类只负责创建对应的产品

②扩展性高,如果想增加一个产品,只要扩展一个工厂子类和具体产品类就可以

③屏蔽产品的具体实现,调用者只关心产品的接口

三、工厂模式(Factory Pattern)的缺点

①每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统复杂度

②一个具体工厂只能创建一种具体产品

四、工厂模式(Factory Pattern)适用场景

①当一个类不知道它所需要的对象的类时

在工厂模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可

②当一个类希望通过其子类来指定创建对象时

在工厂模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象将覆盖父类对象,从而是的系统更容易扩展

③将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中

五、工厂模式(Factory Pattern)举例

举一个生活例子来形象地描述工厂模式。某游戏公司原有一个项目组A,项目组A主要是开发射击类游戏的,今年卡牌类游戏大火,老板决定也开发一款卡牌类游戏,但是考虑到项目组A的成员没有卡牌类游戏的开发经验,于是成立了项目组B来专职负责卡牌类游戏的开发。

六、工厂模式(Factory Pattern)实现

抽象工厂类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class ProjectTeam
{
    public abstract GameType Develop();
}

抽象产品类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class GameType
{
    public abstract void GetGame();
}

具体工厂类A

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ProjectTeamA : ProjectTeam
{
    public override GameType Develop()
    {
        return new GameTypeA();
    }
}

具体工厂类B

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ProjectTeamB : ProjectTeam
{
    public override GameType Develop()
    {
        return new GameTypeB();
    }
}

具体产品类A

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameTypeA : GameType
{
    public override void GetGame()
    {
        Debug.Log("射击类游戏");
    }
}

具体产品类B

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameTypeB : GameType
{
    public override void GetGame()
    {
        Debug.Log("卡牌类游戏");
    }
}

测试

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FactoryTest : MonoBehaviour
{
    void Start()
    {
        ProjectTeamA projectTeamA = new ProjectTeamA();
        projectTeamA.Develop().GetGame();

        ProjectTeamB projectTeamB = new ProjectTeamB();
        projectTeamB.Develop().GetGame();
    }
}

你可能感兴趣的:(设计模式,工厂方法模式)