当前位置: 首页 >  网技达人 >  设计模式-工厂方法模式

设计模式-工厂方法模式

导读:工厂方法模式是一种创建型 设计模式, 提供一种统一的方式来创建对象, 调用者无需关心具体的构建细节.对象的创建过程被封装在工厂类中, 调用者只需要使用一个共同的接口来获取对象, 不需要直接使用new操作符.这样可以降低客户端和具体产品类之间的耦合度, 提高系统的可扩展性和可维护性

工厂方法模式是一种创建型 设计模式, 提供一种统一的方式来创建对象, 调用者无需关心具体的构建细节

对象的创建过程被封装在工厂类中, 调用者只需要使用一个共同的接口来获取对象, 不需要直接使用new操作符

这样可以降低客户端和具体产品类之间的耦合度, 提高系统的可扩展性和可维护性

工厂方法模式的作用

  • 定义统一的工厂接口, 实现了对象创建和使用的分离, 让客户端不需要知道具体的产品类名, 只需要知道产品所属的工厂即可
  • 可以根据不同的需求和环境, 动态地选择具体的产品类来创建对象, 增加了系统的灵活性
  • 可以对产品进行统一的管理和配置, 方便后期维护和升级
  • 可以解耦对象的创建和使用过程, 把对象的实例化交给工厂类
  • 可以灵活应对变化的业务需求, 方便代码管理、避免代码重复
  • ……

工厂方法模式适用于什么场景

当一个类不知道或者不关心它需要创建的对象的具体细节时, 可以使用工厂方法模式

例如, 游戏在开始的时候需要创建一个角色, 但是不知道具体要创建哪种角色(如战士、法师、盗贼等, 角色的选择可能是在这个流程开始之前确定下来的), 同样也不知道创建这些对象都需要什么条件, 这种情况下就可以考虑使用工厂方法模式, 让子类工厂(例如战士工厂)来创建角色

类图

classDiagram 角色<|–战士 角色<|–法师 角色<|–盗贼 角色工厂<|–战士工厂 角色工厂<|–法师工厂 角色工厂<|–盗贼工厂 战士工厂..>战士 法师工厂..>法师 盗贼工厂..>盗贼 角色工厂..>角色 class 角色:::role{ +string 角色名称 +跑路() } class 角色工厂{ +创建角色(): 角色 } class 战士{ +string 角色名称 +跑路() } class 法师{ +string 角色名称 +跑路() } class 盗贼{ +string 角色名称 +跑路() } class 战士工厂{ +创建角色(): 角色 } class 法师工厂{ +创建角色(): 角色 } class 盗贼工厂{ +创建角色(): 角色 }

代码

虽然很怪, 但还是先用中文编码吧, 看懂应该不难

定义角色

public abstract class 角色
{
    protected 角色(string 角色名称) => this.角色名称 = 角色名称;
    public string 角色名称 { get; set; }
    public abstract void 跑路();
}
public class 战士 : 角色
{
    public 战士() : base("战士") { }
    public override void 跑路() => Console.WriteLine($"{角色名称}开着野蛮冲锋跑路");
}
public class 法师 : 角色
{
    public 法师() : base("法师") { }
    public override void 跑路() => Console.WriteLine($"{角色名称}开着疾风术跑路");
}
public class 盗贼 : 角色
{
    public 盗贼() : base("盗贼") { }
    public override void 跑路() => Console.WriteLine($"{角色名称}开着潜行跑路");
}

然后定义对应的角色工厂

public abstract class 角色工厂
{
    public abstract 角色 创建角色();
}
public class 战士工厂 : 角色工厂
{
    public override 角色 创建角色() => new 战士();
}
public class 法师工厂 : 角色工厂
{
    public override 角色 创建角色() => new 法师();
}
public class 盗贼工厂 : 角色工厂
{
    public override 角色 创建角色() => new 盗贼();
}

如何去使用

角色工厂 工厂 = new 法师工厂();
var 玩家角色 = 工厂.创建角色();
玩家角色.跑路();

工厂 = new 盗贼工厂();
玩家角色 = 工厂.创建角色();
玩家角色.跑路();

两次跑路的输出为

法师开着疾风术跑路

盗贼开着潜行跑路

在这种时候可能看不出工厂模式的作用, 下面是一个简单的代码演示

new 山洞副本(new 法师工厂()).危险发生();

class 山洞副本
{
    private 角色 玩家角色;
    private readonly 角色工厂 工厂;
    public 山洞副本(角色工厂 工厂)
    {
        this.工厂 = 工厂;
        Init();
    }

    private void Init()
    {
        Console.WriteLine("开始初始化");
        玩家角色 = 工厂.创建角色();
        Console.WriteLine($"成功加载 {玩家角色.角色名称}");
    }

    public void 危险发生()
    {
        Console.WriteLine("出现大群野生篮球");
        玩家角色.跑路();
        if (DateTime.Now.DayOfWeek == DayOfWeek.Thursday)
        {
            Console.WriteLine("今天是逃不过的肯德基疯狂星期四");
            Console.WriteLine($"角色{玩家角色.角色名称} 死亡,重新初始化");
            Init();
        }
        else
        {
            Console.WriteLine("成功逃脱了!");
        }
    }
}

创建副本时传入角色工厂, 初始化副本数据的时候由工厂创建角色, 当危险发生时触发玩家角色的跑路方法, 如果周四就逃跑失败重新初始化角色, 副本并不需要知道创建角色的细节, 这些细节都被封装在了工厂中

在这种情况下, 即使以后有新增加的角色, 比如平民,游侠什么的, 只需要实现对应的工厂和角色类, 然后在创建副本的时候修改传入的工厂即可

只要副本的业务没有变化就无需更改副本类的代码

内容
  • 最新消息,powershell,10多年的癌症被治好了!
    最新消息,powershell,
    2023-12-10
    问:癌症是指什么?.答:.powershell一直有个特性,它的管道会传递对象,请看:.‘abc’ | ForEach-
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 2分钟快速上手流水线的创建与运行
    2分钟快速上手流水线的创建与运行
    2023-12-09
    摘要: 通过流水线新手体验模板,体验一条含代码检查、构建阶段、部署发布常用流水线的创建与执行。.本文分享自华为云社区《2
  • Three.js教程:对象克隆、复制
    Three.js教程:对象克隆、
    2023-12-08
    推荐:将 NSDT场景编辑器 加入你的3D工具链.其他系列工具: NSDT简石数字孪生.对象克隆.clone()和复制.
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 智能车载设备
    智能车载设备
    2023-10-02
    智能车载设备.我们的智能车载设备是一款结合了最新科技和创新设计的汽车配件,旨在提升驾驶体验、提高安全性和为用户带来智能化
  • 智能医疗设备
    智能医疗设备
    2023-10-02
    智能医疗设备产品介绍.智能医疗设备是一款集成了先进技术的高科技产品,旨在提高医疗保健的效率和质量。该设备主要应用于医院、
  • 互联网金融服务平台
    互联网金融服务平台
    2023-10-01
    互联网金融服务平台.产品功能.个人理财:用户可以通过平台进行投资理财,选择适合自己的理财产品,实现资金增值。.贷款服务:
  • 电子元件电感
    电子元件电感
    2023-10-02
    电子元件电感.产品功能.电感是一种重要的电子元件,用于储存和释放电能,调节电路中的电流和电压。它在电子设备和通讯设备中起
  • 智能智能家居设备
    智能智能家居设备
    2023-10-05
    智能家居设备介绍.产品概述.我们当前运营的产品是智能家居设备,它是一款智能化的家居控制系*,旨在为用户提供更便捷、舒适的
  • 智能可穿戴设备
    智能可穿戴设备
    2023-10-03
    产品功能介绍.我们的智能可穿戴设备是一款集健康监测、运动追踪、通讯互动等多种功能于一体的产品。它采用先进的传感技术,可实
  • 智能手机
    智能手机
    2023-10-01
    产品功能介绍:智能手机.智能手机是一款集通讯、娱乐、办公等功能于一体的移动智能设备。首先,智能手机具有强大的通讯功能,支
  • 智能智能物流设备
    智能智能物流设备
    2023-10-04
    智能物流设备.1. 产品描述.智能物流设备是一款基于物联网技术的智能设备,主要用于运输、储存和**物流货物。其核心功能是
  • 智能智能娱乐设备
    智能智能娱乐设备
    2023-10-04
    产品功能介绍.1. 智能娱乐设备.我们的智能娱乐设备是一款结合了智能技术和娱乐功能的产品。它拥有丰富的娱乐资源,包括音乐
  • 智能电视
    智能电视
    2023-10-01
    产品功能介绍.智能电视是一款结合了传统电视和智能硬件的产品。它内置了智能操作系*,能够连接互联网并运行各种应用程序。智能