三、工厂方法模式

1、基本概念

工厂方法模式属于GoF23中设计模式之一,也是创建型设计模式,工厂方法模式的出现可以解决产品类别进行扩展或者缩减时需要修改工厂类的问题,工厂方法模式在一定程度上比简单工厂模式更加符合开闭原则。
工厂方法模式将工厂类进行了抽象,在简单工厂模式中,只有一个简单工厂类,该简单工厂类并没有向上形成任何抽象,而工厂方法模式通过对工厂本身提供一个抽象层,并在该抽象层中定义了一个抽象的产品创建方法,子类工厂通过实现该方法完成具体产品的创建,该抽象方法也就是工厂方法。
工厂方法模式将对象的创建延迟到子类中进行,客户端只需要依赖抽象级别的工厂和抽象的产品类,在需要创建某个具体的产品的时候,只需要传入一个具体工厂类对象到客户端中即可,借助工厂方法模式可以实现产品类别扩展和缩小的时候只需要新增代码,而对原有代码的改动是极小的,可以很好的符合开闭原则和单一职责原则(后续会说明为什么)。

2、工厂方法模式角色

工厂方法模式中包含如下几个角色:

  1. 抽象产品类,提供了工厂方法需要创建的产品的上层抽象,面向接口编程的需要。
  2. 具体产品类,工厂方法中加工创建的对象。
  3. 抽象的工厂类,该类是所有具体工厂类的顶级父类,提供了一个创建产品的接口,但是没有给出实现,具体产品的创建过程,需要由子类来实现。
  4. 具体工厂类,继承自抽象的工厂类,并实现具体产品的创建步骤,在工厂方法模式中,一个具体工厂类只负责一个具体产品的创建,相比简单工厂来说,这很好的符合单一职责原则。
  5. 客户端类,依赖抽象的工厂以及抽象的产品,完成业务逻辑。

3、工厂方法模式类图

在这里插入图片描述

4、代码实现

  1. AbstractProduct
package factorymethod;

public abstract class AbstractProduct {
    public abstract String getProductUsage();
}
  1. ConcreteProduct
package factorymethod;

public class ConcreteProductA extends AbstractProduct {

    @Override
    public String getProductUsage() {
        return "ConcreteProductA的使用方法";
    }
}
package factorymethod;

public class ConcreteProductB extends AbstractProduct {

    @Override
    public String getProductUsage() {
        return "ConcreteProductB的用法";
    }
    
}
  1. AbstractFactory
package factorymethod;

public abstract class AbstractFactory {
    public abstract AbstractProduct createProduct();
}
  1. ConcreteFactory
package factorymethod;

public class ConcreteProductAFactory extends AbstractFactory {

    @Override
    public AbstractProduct createProduct() {
        return new ConcreteProductA();
    }
    
}
package factorymethod;

public class ConcreteProductBFactory extends AbstractFactory {

    @Override
    public AbstractProduct createProduct() {
        return new ConcreteProductB();
    }
    
}
  1. Client
package factorymethod;

public class Client {
    public static void main(String[] args) {
        AbstractFactory factory = new ConcreteProductAFactory();
        AbstractProduct product = factory.createProduct();
        System.out.println(product.getProductUsage());
    }
}

5、工厂方法模式的优缺点

  1. 优点

在工厂方法模式中,新增一个产品类只需要两步,第一步实现抽象产品的方法,第二步实现抽象的工厂,完成具体产品的创建。无需改动现有的工厂类的代码,因此工厂方法模式很好的解决了简单工厂模式中,因此产品类扩展,而导致的工厂类代码的修改问题,很好的遵守了开闭原则。同时在工厂方法模式中一个工厂类只负责创建一个产品对象,而简单工厂模式中,简单工厂负责创建多个产品对象,因此工厂方法模式相较于简单工厂模式更遵守单一职责原则。

  1. 缺点

工厂方法模式的缺点就是每次增加一个产品类就需要增加一个对应的工厂类,如果产品类非常多,那么工厂类也会随之变多,这会导致类的维护变得困难,导致代码量变多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值