设计模式——工厂模式(2)

「这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

工厂方法模式

上次介绍的简单工厂模式存在了一些缺点。

工厂方法模式是对简单工厂模式的进一步抽象化,满足开闭原则,是系统再不改变原来代码的情况下引进新的产品。工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题

工厂方法模式:通过定义一个工厂的父类(负责定义创建对象的公共接口)

工厂方法模式把类实例化的过程推迟到子类。工厂类不在负责所有产品的创建,给对对应实现的接口当添加新产品时,不需要修改工厂类的逻辑,只需要添加新的工厂子类。

实现

1.png

抽象工厂类,定义具体工厂的公共接口,调用者通过它访问具体工厂的工厂方法 getProduct() 来创建产品。

abstract class AbstractFactory {
    abstract Product getProduct();
}
复制代码

抽象产品类,定义具体产品的公共接口,描述了产品的主要特性和功能。

abstract class Tea {
    public abstract void makeTea();
}
复制代码

具体产品类,继承抽象产品类定义生产的具体产品

public class BlackTea extends Tea {
    @Override
    public void makeProduct() {
        System.out.println("泡一壶红茶");
    }
}
public class GreenTea extends Product {
    @Override
    public void makeProduct() {
        System.out.println("泡一壶绿茶");
​
    }
}
复制代码

具体工厂类,继承抽象工厂类完成具体产品的创建

public class BlackTeaFactory extends AbstractFactory {
    public Tea getProduct() {
        return new BlackTea();
    }
}
public class GreenTeaFactory extends AbstractFactory {
    public Tea getProduct() {
        return new GreenTea();
    }
}
复制代码

总结

优点

  • 这种实现方式更加符合开闭原则,如果新增一种产品,则只需要增加对应的具体产品和相应的工厂子类就可以。
  • 每个工厂只负责生产对应的product,符合单一职责原则。
  • 没有使用静态方法,形成了可以继承的等级结构。

缺点

  • 类的个数容易过多,增加复杂度
  • 一个具体工厂只能生产一种产品,这一弊端抽象工厂模式可以解决。

猜你喜欢

转载自juejin.im/post/7035488579992174628