设计模式 - 工厂方法

工厂方法

  • 定义:定义一个创建对象的接口,但让实现中国接口的类来决定实例化哪个类
  • 工厂方法让类的实例化推迟到子类中进行。 — 这个是核心思想
  • 类型: 创建型

适用场景

  • 创建对象需要大量的重复的代码
  • 客户端不依赖于产品类的实例如何被创建,实现等细节
  • 一个类通过其子类来制定创建哪个对象

原则

  • java的多态性和里氏替换原则
  • 在程序运行的时候,子类对象将覆盖父类的对象从而使系统更加容易扩展。

优点

  • 用户只需要关系所需产品对应的工厂无须关系创建细节
  • 加入新产品符合开闭原则,提高可扩展性

缺点

  • 类的个数容易过多,添加了复杂度
  • 添加了系统的抽象性和理解难度

和简单工厂的区别

  • 简单工厂在工厂中实现对象的创建
  • 工厂方法在工厂中调用对象的父类创建方法,具体的创建过程是由子类实现的。
  • 如果小伙伴对简单工厂不是很清楚可以参考 设计模式 - 简单工厂

角色

  • 抽象工厂
  • 抽象工厂实现
  • 抽象对象
  • 具体的对象

Coding

public interface Computer {
    /**
     * 生产电脑
     */
    void produce();
}
  • 具体电脑的实现
public class AppleComputer implements Computer {

    public void produce() {
        System.out.println("苹果电脑");
    }
}
public class LenovoComputer implements Computer {

    public void produce() {
        System.out.println("联想电脑");
    }
}
  • 生产电脑的工厂

public abstract class ComputerFactory {

    /**
     * 获取电脑的抽象方法
     * @return
     */
     abstract Computer getComputer();
}
  • 具体生产某个电脑的工厂
public class AppleComputerFoctory extends ComputerFactory{
    @Override
    Computer getComputer() {
        return new AppleComputer();
    }
}
public class LenovoComputerFoctory extends ComputerFactory{
    @Override
    Computer getComputer() {
        return new LenovoComputer();
    }
}
  • 使用
public class FactoryMethodTest {
    public static void main(String[] args) {
        //工厂方法

        ComputerFactory computerFactory = new AppleComputerFoctory();
        Computer computer = computerFactory.getComputer();
        computer.produce();

        ComputerFactory computerFactory1 = new LenovoComputerFoctory();
        Computer computer1 = computerFactory1.getComputer();
        computer1.produce();

    }
}
  • UML图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UpRbrXr-1583555275316)(https://i.loli.net/2020/03/07/51ZEd2Yex7nFaf3.jpg)]

  • 从图中我们看到具体的创建不是在工厂父类中实现,而是交给各个的产品工厂类实现。
  • 如果我们需要新增一个戴尔的电脑。我们需要定义一个戴尔的产品,和戴尔的工厂类即可

源码

  • 设计模式的其他源码地址都在这里哦! 源码地址

注意点

  • 工厂方法使用与一个产品族,换句话说就是同一类的产品。如果你这边想新增一个电冰箱就刚才方法就不适用了,而是我们接下来将的抽象工厂。
发布了59 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_33249725/article/details/104712779