工厂方法
- 定义:定义一个创建对象的接口,但让实现中国接口的类来决定实例化哪个类
- 工厂方法让类的实例化推迟到子类中进行。 — 这个是核心思想
- 类型: 创建型
适用场景
- 创建对象需要大量的重复的代码
- 客户端不依赖于产品类的实例如何被创建,实现等细节
- 一个类通过其子类来制定创建哪个对象
原则
- 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图
- 从图中我们看到具体的创建不是在工厂父类中实现,而是交给各个的产品工厂类实现。
- 如果我们需要新增一个戴尔的电脑。我们需要定义一个戴尔的产品,和戴尔的工厂类即可
源码
- 设计模式的其他源码地址都在这里哦! 源码地址
注意点
- 工厂方法使用与一个产品族,换句话说就是同一类的产品。如果你这边想新增一个电冰箱就刚才方法就不适用了,而是我们接下来将的抽象工厂。