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

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

一、定义

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

二、问题

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

三、解决方案

工厂方法模式就很好解决了这个问题。使用特殊的工厂方法代替对于对象构造函数的直接调用(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;

扫描二维码关注公众号,回复: 13799436 查看本文章
/**
 * @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图

在这里插入图片描述

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

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

七、总结

优点

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

缺点

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

八、与其他模式比较

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

猜你喜欢

转载自blog.csdn.net/weixin_51799151/article/details/123997846
今日推荐