工厂方法模式, 实际上核心就是 让子类决定该创建的对象是什么

1. 定义

工厂方法模式定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个
工厂方法让类把实例化推迟到子类

image.png


2. 工厂方法模式中的角色

产品类:

  1. 抽象产品类
  2. 具体产品类: 继承了抽象产品类

创建者类:

  1. 抽象创建者
  2. 具体创建者: 继承了抽象创建者

一个具体的创建者, 可以创建1个或多个具体产品实体


3. 举个实例

  1. 定义抽象产品类

    1. public abstract class 哲学家 {
    2. public void 格斗() {
    3. 叫喊();
    4. 发动技能();
    5. }
    6. protected abstract void 叫喊();
    7. protected abstract void 发动技能();
    8. }
  2. 具体产品类

    1. public class extends 哲学家{
    2. @Override
    3. protected void 叫喊() {
    4. System.out.println("我要搞死你!");
    5. }
    6. @Override
    7. protected void 发动技能() {
    8. System.out.println("摔跤");
    9. }
    10. }
    1. public class 暗黑佟大为 extends 哲学家{
    2. @Override
    3. protected void 叫喊() {
    4. System.out.println("FAQ");
    5. }
    6. @Override
    7. protected void 发动技能() {
    8. System.out.println("打屁股");
    9. }
    10. }
  3. 抽象创建者

    1. public interface 哲学家梦工厂 {
    2. 哲学家 培养哲学家();//工厂方法
    3. }
  4. 具体创建者

    1. public class 美国哲学梦工厂 implements 哲学家梦工厂{
    2. @Override
    3. public 哲学家 培养哲学家() {
    4. return new 王();
    5. }
    6. }
    1. public class 中国哲学梦工厂 implements 哲学家梦工厂{
    2. @Override
    3. public 哲学家 培养哲学家() {
    4. return new 暗黑佟大为();
    5. }
    6. }
  • 使用

    1. public class Main {
    2. public static void main(String[] args) {
    3. 哲学家梦工厂 哲学梦工厂 = new 中国哲学梦工厂();
    4. 哲学家 哲学家 = 哲学梦工厂.培养哲学家();
    5. 哲学家.格斗();
    6. }
    7. }
  • 看看效果

image.png


4. JDK中的工厂方法模式

  1. 抽象产品类: Iterator
  2. 具体产品类: java.util.ArrayList.Itr , java.util.LinkedList.ListItr, java.util.HashMap.KeyIterator ….
  3. 抽象创建者: Collection
  4. 具体创建者: ArrayList, LinkedList, HashSet