设计模式-(4)工厂方法模式(Factory Method Pattern)

本文介绍了工厂方法模式如何解决简单工厂模式的问题,通过多态性实现对象创建的延迟,符合开放封闭原则。文中提供了具体的代码示例,展示了如何通过新增具体工厂类来扩展系统而不改变原有代码。

一、引言
  在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的。

二、工厂方法模式的实现
  工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。

public abstract class BMW
{
    public BMW()
    {

    }
}

public class BMW320 : BMW
{
    public BMW320()
    {
        Console.WriteLine("制造-->BMW320");
    }
}

public class BMW523 : BMW
{
    public BMW523()
    {
        Console.WriteLine("制造-->BMW523");
    }
}

/// <summary>
///  抽象工厂类
/// </summary>
public abstract class FactoryBMW
{
    /// <summary>
    ///  工厂方法
    /// </summary>
    /// <returns></returns>
    public abstract BMW CreateBMW();
}


public class FactoryBMW320 : FactoryBMW
{
    public override BMW CreateBMW()
    {
        return new BMW320();
    }
}


public class FactoryBMW523 : FactoryBMW
{
    public override BMW CreateBMW()
    {
        return new BMW523();
    }
}

public class Customer
{
    public static void Main()
    {
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        BMW bmw320 = factoryBMW320.CreateBMW();

        FactoryBMW523 factoryBMW523 = new FactoryBMW523();
        BMW bmw523 = factoryBMW523.CreateBMW();
    }
}

使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们的车型又多了911,此时我们只需要定义一个911具体工厂类和911子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。

public class BMW911 : BMW
{
    public BMW911()
    {
        Console.WriteLine("制造-->BMW911");
    }
}

public class FactoryBMW911 : FactoryBMW
{
    public override BMW CreateBMW()
    {
        return new BMW911();
    }
}

public class Customer
{
    public static void Main()
    {
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        BMW bmw320 = factoryBMW320.CreateBMW();

        FactoryBMW523 factoryBMW523 = new FactoryBMW523();
        BMW bmw523 = factoryBMW523.CreateBMW();

        FactoryBMW911 factoryBMW911 = new FactoryBMW911();
        BMW bmw911 = factoryBMW911.CreateBMW();
    }
}

在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的

FactoryBMW 类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类

FactoryBMW320FactoryBMW523 类:充当具体工厂角色,用来创建具体产品

BMW 类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类

BMW320BMW523 类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。

三、总结

工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。

工厂模式(Factory Pattern)
定义:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)

简单工厂模式:
一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法
多个工厂类:
每个人种(具体的产品类)都对应了一个创建者,每个创建者独立负责创建对应的产品对象,非常符合单一职责原则
代替单例模式:
单例模式的核心要求就是在内存中只有一个对象,通过工厂方法模式也可以只在内存中生产一个对象
延迟初始化:
ProductFactory负责产品类对象的创建工作,并且通过prMap变量产生一个缓存,对需要再次被重用的对象保留
使用场景:jdbc连接数据库,硬件访问,降低对象的产生和销毁

缺点:
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。

无界云图(开源在线图片编辑器源码)是由四川爱趣五科技推出的一款类似可画、创客贴、图怪兽的在线图片编辑器。该项目采用了React Hooks、Typescript、Vite、Leaferjs等主流技术进行开发,旨在提供一个开箱即用的图片编辑解决方案。项目采用 MIT 协议,可免费商用。 无界云图提供了一系列强大的图片编辑功能,包括但不限于: 素材管理:支持用户上传、删除和批量管理素材。 操作便捷:提供右键菜单,支持撤销、重做、导出图层、删除、复制、剪切、锁定、上移一层、下移一层、置顶、置底等操作。 保存机制:支持定时保存,确保用户的工作不会丢失。 主题切换:提供黑白主题切换功能,满足不同用户的视觉偏好。 多语言支持:支持多种语言,方便全球用户使用。 快捷键操作:支持快捷键操作,提高工作效率。 产品特色 开箱即用:无界云图采用了先进的前端技术,用户无需进行复杂的配置即可直接使用。 免费商用:项目采用MIT协议,用户可以免费使用和商用,降低了使用成本。 技术文档齐全:提供了详细的技术文档,包括技术文档、插件开发文档和SDK使用文档,方便开发者进行二次开发和集成。 社区支持:提供了微信技术交流群,用户可以在群里进行技术交流和问题讨论。 环境要求 Node.js:需要安装Node.js环境,用于运行和打包项目。 Yarn:建议使用Yarn作为包管理工具,用于安装项目依赖。 安装使用 // 安装依赖 yarn install // 启动项目 yarn dev // 打包项目 yarn build 总结 无界云图是一款功能强大且易于使用的开源在线图片编辑器。它不仅提供了丰富的图片编辑功能,还支持免费商用,极大地降低了用户的使用成本。同时,详细的文档和活跃的社区支持也为开发者提供了便利的二次开发和集成条件。无论是个人用户还是企业用户,都可以通过无界云图轻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值