工厂方法模式是简单工厂模式进一步抽象化,其好处是可以使系统在不需要进修改具体工厂角色的情况下引进新的产品,即满足开闭原则。
一、工厂方法模式
1.定义
工厂方法模式(FACTORY METHOD)是常用的类创建型设计模式、又被称为多态工厂模式。
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
2.工厂方法模式的结构
(1)角色结构
- 抽象工厂(Creator)角色
是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
- 具体工厂(Concrete Creator)角色
是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
- 抽象产品(Product)角色
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(Concrete Product)角色
实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
(2)结构图(来源于网络)
3.优缺点
优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
缺点
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
- 抽象产品只能生产一种产品
4.使用场景
- 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
- 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
二、通用实现
public class FactoryMethod {
public static void main(String[] args) {
}
}
//定义抽象产品,提供接口
interface Product{
public void show();
}
//定义具体产品1,实现抽象产品中的抽象方法
class ConcreteProduct1 implements Product{
@Override
public void show() {
System.out.println("这是具体产品1");
}
}
//定义具体产品2,实现抽象产品中的抽象方法
class ConcreteProduct2 implements Product{
@Override
public void show() {
System.out.println("这是具体产品2");
}
}
//定义抽象工厂,提供生成产品的方法
interface Creator{
public Product newProduct();
}
//定义具体工厂1,实现抽象工厂中的抽象方法,生成具体产品1
class ConcreteCreator1 implements Creator{
@Override
public Product newProduct() {
System.out.println("这是具体工厂1,生成产品1");
return new ConcreteProduct1();
}
}
//定义具体工厂2,实现抽象工厂中的抽象方法,生成具体产品2
class ConcreteCreator2 implements Creator{
@Override
public Product newProduct() {
System.out.println("这是具体工厂2,生成产品2");
return new ConcreteProduct2();
}
}
三、模式的应用实例
输入两个数的,分别得到和,差,积,商
可以通过简单工厂模式的改造形成工厂方法模式
1.抽象工厂
interface Creator{
Product CreatorProduct();
}
2.具体工厂
加法(其他方法类似)
class AdditionCreator implements Creator{
@Override
public Product CreatorProduct() {
return new AdditionProduct();
}
}
3.抽象产品
interface Product{
double number(double num1, double num2) throws Exception ;
}
4.具体产品
加法(其他方法类似)
class AdditionProduct implements Product {
@Override
public double number(double num1, double num2) {
return num1 + num2;
}
}
测试结果