【设计模式】创造型模式——工厂方法模式

工厂方法模式是一种创建型设计模式,用于解决在不修改原有代码的情况下引入新产品类型的问题。通过将产品创建逻辑移至专门的工厂类,实现了代码的开闭原则。在本文中,我们展示了如何通过工厂方法模式实现卡车和轮船的运输服务,并讨论了其适用场景、优缺点以及与其他模式的比较。
摘要由CSDN通过智能技术生成

创造型模式——工厂方法模式

一、定义

工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

二、问题

假设 一个公司的快递运输一开始只用卡车在陆地运输,后来随着人数和需求的增多,需要运货到海外,所以要增加轮船在海上运输,那么我们就需要对程序的代码进行大篇幅修改,显然不符合开闭原则。

三、解决方案

工厂方法模式就很好解决了这个问题。使用特殊的工厂方法代替对于对象构造函数的直接调用(new 对象) 。

四、实现

1、产品
对接口进行声明。 对于所有由创建者及其子类构建的对象, 这些接口都是通用的

package com.atmae.factory;

/**
 * @Author: Mae
 * @Date: 2022/4/6
 * @Time: 19:49
 * @Description:
 */
public interface Product {
    void deliver();
}

2、具体产品
是产品接口的不同实现。
卡车:

package com.atmae.factory;

/**
 * @Author: Mae
 * @Date: 2022/4/6
 * @Time: 19:49
 * @Description:
 */
public class Truck implements Product{
    @Override
    public void deliver() {
        System.out.println("使用卡车在陆地运输");
    }
}

轮船:

package com.atmae.factory;

/**
 * @Author: Mae
 * @Date: 2022/4/6
 * @Time: 19:48
 * @Description:
 */
public class Ship implements Product{
    @Override
    public void deliver() {
        System.out.println("使用轮船在海上运输");
    }
}

3、创建工厂
类声明返回产品对象的工厂方法。 该方法的返回对象类型必须与产品接口相匹配。

package com.atmae.factory;

/**
 * @Author: Mae
 * @Date: 2022/4/6
 * @Time: 19:47
 * @Description:
 */
public abstract class Factory {
  public abstract Product createProduct();
}

4、具体工厂类

将会重写基础工厂方法, 使其返回不同类型的产品。
package com.atmae.factory;

/**
 * @Author: Mae
 * @Date: 2022/4/6
 * @Time: 19:48
 * @Description:
 */
public class ShipFactory extends Factory{

    @Override
    public Product createProduct() {
        return new Ship();
    }
}
package com.atmae.factory;

/**
 * @Author: Mae
 * @Date: 2022/4/6
 * @Time: 19:48
 * @Description:
 */
public class TruckFactory extends Factory{
    @Override
    public Product createProduct() {
        return new Truck();
    }
}

5、客户端

客户端只需要使用创建工厂抽象类来实现具体工厂(多态),由该具体工厂来返回产品类型

package com.atmae.factory;

/**
 * @Author: Mae
 * @Date: 2022/4/6
 * @Time: 19:48
 * @Description:
 */
public class Client {
    public static void main(String[] args) {
        Factory factory=new ShipFactory();
        Product product = factory.createProduct();
        product.deliver();
    }
}

五、UML图

在这里插入图片描述

六、工厂方法模式适合场景

  • 在编写代码的过程中, 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
  • 希望复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法。
  • 希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法

七、总结

优点

  • 单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
  • 开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。
  • 可以避免工厂和具体产品之间的紧密耦合。

缺点

  • 引入许多新的子类, 代码可能会因此变得更复杂

八、与其他模式比较

  • 与简单工厂
    简单工厂是所有产品都被一个工厂所管理,而工厂方法是每个产品都被为不同的工厂所管理,这些所有工厂都继承自抽象工厂类。
    工厂方法将简单工厂的内部逻辑移到了客户端。增加功能修改的是客户端而不再是工厂类。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mae_strive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值