工厂方法模式, 实际上核心就是 让子类决定该创建的对象是什么
1. 定义
工厂方法模式定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个
工厂方法让类把实例化推迟到子类

2. 工厂方法模式中的角色
产品类:
- 抽象产品类
 - 具体产品类: 继承了抽象产品类
 
创建者类:
- 抽象创建者
 - 具体创建者: 继承了抽象创建者
 
一个具体的创建者, 可以创建1个或多个具体产品实体
3. 举个实例
定义抽象产品类
public abstract class 哲学家 {public void 格斗() {叫喊();发动技能();}protected abstract void 叫喊();protected abstract void 发动技能();}
具体产品类
public class 王 extends 哲学家{@Overrideprotected void 叫喊() {System.out.println("我要搞死你!");}@Overrideprotected void 发动技能() {System.out.println("摔跤");}}
public class 暗黑佟大为 extends 哲学家{@Overrideprotected void 叫喊() {System.out.println("FAQ");}@Overrideprotected void 发动技能() {System.out.println("打屁股");}}
抽象创建者
public interface 哲学家梦工厂 {哲学家 培养哲学家();//工厂方法}
具体创建者
public class 美国哲学梦工厂 implements 哲学家梦工厂{@Overridepublic 哲学家 培养哲学家() {return new 王();}}
public class 中国哲学梦工厂 implements 哲学家梦工厂{@Overridepublic 哲学家 培养哲学家() {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… 
