说明
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
应用场景
- 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况
- 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
模式特征
- 一个抽象产品类——Computer
- 多个具体产品类——LenovoComputer、HuaWeiComputer
- 一个抽象工厂——ComputerFactory
- 多个具体工厂,每个具体工厂对应一个具体产品——LenovoFactory、HuaWeiFactory
UML
代码实现
- 抽象产品类
public interface Computer {
void computerInfo();
}
- 具体产品类一
public class LenovoComputer implements Computer {
public void computerInfo() {
System.out.println("我是联想电脑");
}
}
- 具体产品类二
public class HuaWeiComputer implements Computer {
public void computerInfo() {
System.out.println("我是华为电脑");
}
}
- 抽象工厂
public interface ComputerFactory {
Computer generateComputer();
}
- 具体工厂类一
public class LenovoFactory implements ComputerFactory {
public Computer generateComputer() {
return new LenovoComputer();
}
}
- 具体工厂类二
public class HuaWeiFactory implements ComputerFactory {
public Computer generateComputer() {
return new HuaWeiComputer();
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
ComputerFactory computerFactory = new LenovoFactory();//生产哪件电脑由客户决定
Computer computer = computerFactory.generateComputer();
computer.computerInfo();
}
}
优缺点
- 优点:降低了代码耦合度,对象的生成交与子类完成;实现了OCP原则,每次添加子产品不需要修改源代码。
- 缺点:代码量增大,每个具体产品需要一个具体工厂;当增加抽象产品,也就是添加一个其他产品类时,需要修改工厂,违背开闭原则