介绍
* 工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式
* 此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的
* 它的核心结构有四个角色,分别是 抽象工厂、具体工厂、抽象产品、具体产品
定义
* 定义一个用于创建对象的接口,让子类决定实例化哪一个类。
* 工厂方法是一个类实例化延迟到其子类
简单工厂模式 vs 工厂方法模式
* 简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可,但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护;
* 工厂方法模式相当于在简单工厂模式的基础上增加一个抽象工厂,在简单工厂模式下如果增加一个产品,要修改工厂类,不符合开闭原则。在工厂方法下,只需要增加具体工厂和具体产品即可;
* 工厂方法模式是简单工厂模式的进一步抽象,降低客户端代码的耦合性
使用场景
* 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况
* 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的
百度百科(https://baike.baidu.com/item/工厂方法模式/2361103?fr=aladdin)
入门案例:
UML图解:
[简单工厂]
[工厂方法]
代码:
[Product]
Person:
public interface Person {
void speak();
}
[ConcreteProduct]
Student:
public class Student implements Person {
@Override
public void speak() {
System.out.println("我是学生");
}
}
Worker:
public class Worker implements Person {
@Override
public void speak() {
System.out.println("我是工人");
}
}
[Creator]
Factory:
public interface Factory {
Person createPerson();
}
[ConcreteCreator]
StudentFactory:
public class StudentFactory implements Factory {
@Override
public Person createPerson() {
return new Student();
}
}
WorkerFactory:
public class WorkerFactory implements Factory {
@Override
public Person createPerson() {
return new Worker();
}
}
测试:
public class Main {
public static void main(String[] args){
// Factory factory = new StudentFactory();
Factory factory = new WorkerFactory();
Person person = factory.createPerson();
person.speak();
}
}