文章目录

  • 1、工厂方法模式介绍
  • 2、工厂方法模式的定义
  • 3、使用场景
  • 4、模式的简单实现


1、工厂方法模式介绍

工厂方法模式(Factory Pattern ),是创建型设计模式之一。工厂方法模式是一个结构比较简单的模式。

2、工厂方法模式的定义

就是一个用于创建对象的接口,让子类来决定实体化那个类。

3、使用场景

在任何需要生成复杂对象的地方,都可以使用工厂模式。

4、模式的简单实现

我们以生活中一个例子来说明:
一个汽车厂主要的组装某款SUV车型,有Q3, Q5, Q7, 对于这类车内部结构差异性并不是很大。
因此一条生产线足以应对这3种车型,对于该类生产线工厂提供了一个抽象类定义。

public   abstract   class AudiFactory {

    //某车型的工厂方法
    // clz 具体的suv  型号
    //return 具体的suv 对象

    public abstract  <T extends  AudiCar> T createAudiCar (Class<T> clz);
}

工厂的3中suv 车型可能在主结构上并没有什么差异,因此并没有什么必要为每一种车型都提供一条不同的生产线即可:

//为相似车型设置 同一条生产线
public  class  AudiCarFactory extends  AudiFactory {

    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {

            car = (AudiCar) Class.forName(clz.getName()).newInstance();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) car;
    }
}

定义车的基本功能的 类

//相似车型的基本构成 汽车的抽象产品类
public abstract  class AudiCar {

    public AudiCar () {}
    //定义汽车的一个行为方法, 车可以行走
    public abstract  void drive();

    //定义汽车可以自动巡航
    public abstract void selfNavigation();
}

接下来定义每种具体的车型

//生产具体车型
    public class AudiQ3 extends  AudiCar {

        @Override
        public void drive() {
            System.out.println("Q3 启动了");
        }

        @Override
        public void selfNavigation() {
            System.out.println("Q3 开始自动巡航了");
        }
    }


    public class AudiQ5 extends  AudiCar {

        @Override
        public void drive() {
            System.out.println("Q5 启动了");
        }

        @Override
        public void selfNavigation() {
            System.out.println("Q5 开始自动巡航了");
        }
    }

    public class AudiQ7 extends  AudiCar {

        @Override
        public void drive() {
            System.out.println("Q7 启动了");
        }

        @Override
        public void selfNavigation() {
            System.out.println("Q7 开始自动巡航了");
        }
    }

最后我们将各种类组装起来形成一条完整的流水线。

public class ClientClass {
    public static void main(String[] args) {
        //构造一个制造汽车工厂的工厂对象
        AudiFactory factory = new AudiCarFactory();

        //生产 Q3 并启动
        AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
        audiQ3.drive();
        audiQ3.selfNavigation();

        //生产 Q5 并启动
        AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
        audiQ5.drive();
        audiQ5.selfNavigation();

        //生产 Q7 并启动
        AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
        audiQ7.drive();
        audiQ7.selfNavigation();

    }

最后输出结果如下:
Q3 启动了
Q3 开始自动巡航了
Q5 启动了
Q5 开始自动巡航了
Q7 启动了
Q7 开始自动巡航了

(自己在studio上运行,没有实现 ,出现 bug :
10-12 15:27:29.835 21457-21457/com.example.menglux.factorymode W/System.err: java.lang.InstantiationException: can’t instantiate class com.example.menglux.factorymode.ClientActivity$AudiQ3; no empty constructor

在此只做思路整理
工厂模式,简单一点,就是将相同类型的类,通过一个接口来实现 对象的实例化,而不是通过 new.

文献参考:
Android 源码设计模式解析与实战 第二版

本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。