介绍
工厂模式就是对简单工厂的再次抽象,主要功能是让父类在不知道具体实现的情况下,完成自身的功能调用;而具体的实现延迟到子类来实现,在简单工厂中factory承担了所有产品的加工细节,那么工厂模式不考虑具体加工的实现,而是将细节实现交给子类,而自身只负责对子类的管理
具体实现
角色划分
ProductApi:生产者API,用于定义生产者的行为规范,即抽象接口
ConcreteProduct:生产者角色,具体已经实现接口的生产者
ProductFactory:抽象的工厂,根据参数创建具体的工厂
ConcreteFactory:具体的工厂,只负责具体的某个生产者的加工
Client:消费者,需要使用具体的某个生产者
代码实现
ProductApi类(程序员接口)
public interface Programmer {
void dayLife();
}
ProductRole(程序员1和程序员2)
public class Programmer1 implements Programmer{
@Override
public void dayLife() {
System.out.println("程序员1:起床-敲代码-吃饭-睡觉");
}
}
public class Programmer2 implements Programmer{
@Override
public void dayLife() {
System.out.println("程序员2:起床-敲代码-吃饭-陪女朋友逛街-睡觉");
}
}
ProductFactory(抽象的程序员工厂)
public abstract class ProgrammerFactory {
public abstract Programmer getConcreteProgrammer();
public Programmer getProgrammer() {
Programmer programmer = null;
// 所有工厂都需要的前缀统一加工
programmer = getConcreteProgrammer();
// 所有工厂都需要的后缀统一加工
return programmer;
}
}
ConcreteFactory(具体的工厂)
public class Programmer1Factory extends ProgrammerFactory {
@Override
public Programmer getConcreteProgrammer() {
// 一系列加工......
return new Programmer1();
}
}
public class Programmer2Factory extends ProgrammerFactory {
@Override
public Programmer getConcreteProgrammer() {
// 一系列加工......
return new Programmer2();
}
}
Client(用于测试的消费者1)
public class Client1 {
public static void main(String[] args) {
ProgrammerFactory programmerFactory = new Programmer1Factory();
Programmer programmer = programmerFactory.getProgrammer();
programmer.dayLife();
}
}
优缺点
优点
解决了简单工厂的缺陷,形成了以继承为体系的工厂结构,便于对各个工厂进行管理,如果后续新增一个产品,只需要你再添加一个工厂类并继承抽象的工厂然后编写新工厂的加工过程就完事了
简单两句话:可以在不知具体实现的情况下编程,更容易扩展新产品
缺点
引入抽象工厂和大量的工厂类,增加系统复杂度,事实上设计模式很多都是以复杂度换取扩展性
注意点
当工厂模式没有上述代码中的前缀加工和后缀加工,所有的加工过程都只交给子类,那么事实上工厂模式就退化成了多个简单工厂而已
使用时机
- 如果一个类需要创建某个接口的对象,但是又不知道具体的实现,这种情况可以选用工厂方法模式,把创建对象的工作延迟到子类中去实现
- 如果一个类本身就希望由它的子类来创建所需的对象的时候,应该使用工厂方法模式
总的来说工厂模式重视抛开类的创建的具体实现过程与细节,把这个操作抛给它的子类去实现
JDK源码分析
在JDK中就有这样一个类使用工厂模式,就是java.util.Calendar日期类,截取一部分方法
图中Builder是Calendar的内部类,Calendar是一个抽象类,它的具体实现抛给了子类,这里Calendar就是我们所说的工厂类中的抽象的那一层,它的子类就是生产不同Calendar的具体的工厂,Calendar的一系列方法包括Builder内部类都是为了生产Calendar而提供的