工厂方法模式定义
定义一个用于创建对象的接口(抽象工厂),但是让子类(具体子类工厂)决定将哪一个类(具体产品)实例化。工厂方法模式让一个类的实例化延迟到子类(让具体产品实例化延迟到具体子类工厂)。
解释:定义一个抽象工厂,以及具体子类工厂,由具体子类工厂决定创建、实例化具体产品。
工厂方法模式结构图
一般实际情况结构图:
工厂方法模式角色介绍
Factory:抽象工厂角色,声明了抽象工厂方法,所有具体创建工厂都要继承抽象工厂。
ConcreteFactory:具体工厂角色,实现抽象工厂声明的抽象工厂方法,创建并返回一个具体产品实例。
Product:抽象产品角色,它是所有产品的父类,也是工厂角色工厂方法的返回值类型。
ConcreteProduct:具体产品角色,继承了抽象产品角色,实现了抽象产品中声明的抽象方法;它是具体产品工厂负责创建的目标,与具体产品工厂一一对应。
工厂方法模式结构代码
抽象产品:
public abstract class Product {
public abstract void sayName();
}
具体产品:
ConcreteProductA:
public class ConcreteProductA extends Product {
public void sayName() {
System.out.println("ConcreteProductA");
}
}
ConcreteProductB
public class ConcreteProductB extends Product {
public void sayName() {
System.out.println("ConcreteProductB");
}
}
抽象工厂:
public abstract class Factory {
/**
* 定义工厂方法,给客户使用,改方法内部调用实例化产品方法,实现客户调用与产品创建隔离
* @param type
*/
public void showProduct(){
Product product = createProduct();
product.sayName();
}
/**
* 定义抽象工厂方法,创建产品,创建过程延迟到子类
* @param type
* @return
*/
abstract Product createProduct();
}
具体工厂:
FactoryA:
public class FactoryA extends Factory{
public Product createProduct() {
return new ConcreteProductA();
}
}
FactoryB:
public class FactoryB extends Factory{
public Product createProduct() {
return new ConcreteProductB();
}
}
客户端:
public class Client {
public static void main(String[] args) {
//客户端按照需要获取具体子类工厂实例
Factory factory = new FactoryA();
factory.showProduct();
}
}
工厂方法模式运行机制
抽象工厂类定义用于创建产品对象的抽象工厂方法,由子类实现该方法,也就是如定义所说’将一个类的实例化延迟到子类’。
工厂方法模式解决的问题
将一个类的实例化延迟到子类(子类指的是具体工厂子类),并且获取子类可以实现动态化、配置化,每个具体工厂子类只负责一个具体产品,去掉了简单工厂模式创建产品的if判断语句。
工厂方法模式符合面向对象的设计原则
工厂方法模式除了符合简单工厂模式中体现的设计原则(依赖倒转原则和里氏替换原则),还符合单一职责原则和开闭原则,方便进行扩展。