工厂方法模式

定义

工厂方法模式属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义在于定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中,核心工厂类不再负责产品的创建,仅负责声明具体工厂子类必须实现的接口。
这样进一步抽象画的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

适用场景

1)创建对象需要大量重复的代码
2)客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
3)一个类通过其子类来指定创建哪个对象

优点和缺点

优点

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

缺点

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

代码实现

创建抽象产品类

我们创建一个电脑的抽象产品类,他有一个抽象方法用于启动电脑

1
2
3
4
5
6
public abstract class Computer {
/**
* 产品的抽象方法,由具体的产品类去实现
*/
public abstract void start();
}

创建具体产品类

接着我们创建各个品牌的电脑,他们都继承了他们的父类Computer,并实现了父类的start方法。

联想电脑

1
2
3
4
5
6
public class LenovoComputer extends Computer{
@Override
public void start() {
System.out.println("联想电脑启动");
}
}

惠普电脑

1
2
3
4
5
6
public class HpComputer extends Computer{
@Override
public void start() {
System.out.println("惠普电脑启动");
}
}

华硕电脑

1
2
3
4
5
6
public class AsusComputer extends Computer{
@Override
public void start() {
System.out.println("华硕电脑启动");
}
}

创建一个工厂抽象类,具体创建产品的代码由工厂抽象类的子类去实现

1
2
3
4
5
6
7
public abstract class ComputerFactory {

/**
* 工厂方法创建产品接口抽象化,将具体创建产品的代码写到工厂方法子类中
*/
public abstract Computer createComputer();
}

创建联想电脑的工厂实现

1
2
3
4
5
6
public class LenovoComputerFactory extends ComputerFactory{
@Override
public Computer createComputer() {
return new LenovoComputer();
}
}

创建惠普电脑的工厂实现

1
2
3
4
5
6
7
public class HpComputerFactory extends ComputerFactory{

@Override
public Computer createComputer() {
return new HpComputer();
}
}

创建华硕电脑的工厂实现

1
2
3
4
5
6
public class AsusComputerFactory extends ComputerFactory{
@Override
public Computer createComputer() {
return new AsusComputer();
}
}

客户端调用

1
2
3
4
5
6
7
8
9
10
public class Test {

public static void main(String[] args) {
//通过工厂方法的子类去创建对应的工厂类
//每次增加新的产品,只需要新建一个抽象工厂方法的子类即可,不会对现有的产品产生影响
ComputerFactory computerFactory = new HpComputerFactory();
Computer computer = computerFactory.createComputer();
computer.start();
}
}

UML图