工厂方法模式, 实际上核心就是 让子类决定该创建的对象是什么
1. 定义
工厂方法模式定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个
工厂方法让类把实例化推迟到子类
2. 工厂方法模式中的角色
产品类:
- 抽象产品类
- 具体产品类: 继承了抽象产品类
创建者类:
- 抽象创建者
- 具体创建者: 继承了抽象创建者
一个具体的创建者, 可以创建1个或多个具体产品实体
3. 举个实例
定义抽象产品类
public abstract class 哲学家 {
public void 格斗() {
叫喊();
发动技能();
}
protected abstract void 叫喊();
protected abstract void 发动技能();
}
具体产品类
public class 王 extends 哲学家{
@Override
protected void 叫喊() {
System.out.println("我要搞死你!");
}
@Override
protected void 发动技能() {
System.out.println("摔跤");
}
}
public class 暗黑佟大为 extends 哲学家{
@Override
protected void 叫喊() {
System.out.println("FAQ");
}
@Override
protected void 发动技能() {
System.out.println("打屁股");
}
}
抽象创建者
public interface 哲学家梦工厂 {
哲学家 培养哲学家();//工厂方法
}
具体创建者
public class 美国哲学梦工厂 implements 哲学家梦工厂{
@Override
public 哲学家 培养哲学家() {
return new 王();
}
}
public class 中国哲学梦工厂 implements 哲学家梦工厂{
@Override
public 哲学家 培养哲学家() {
return new 暗黑佟大为();
}
}
使用
public class Main {
public static void main(String[] args) {
哲学家梦工厂 哲学梦工厂 = new 中国哲学梦工厂();
哲学家 哲学家 = 哲学梦工厂.培养哲学家();
哲学家.格斗();
}
}
看看效果
4. JDK中的工厂方法模式
- 抽象产品类:
Iterator
- 具体产品类:
java.util.ArrayList.Itr
,java.util.LinkedList.ListItr
,java.util.HashMap.KeyIterator
…. - 抽象创建者:
Collection
- 具体创建者:
ArrayList
,LinkedList
,HashSet
…