设计模式之工厂方法模式

工厂方法模式属于创建设计模式之一,是一种比较简单的设计模式,应用比较广泛。工厂方法模式的定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式适合用于复杂对象的创建过程,而通过new就可以实例化的对象不需要使用该模式。

  1. 首先新建一个“产品”抽象类

    public abstract class AudiCar {
    /**
     * 汽车抽象产品类
     * 定义汽车的一个行为方法,车可以启动开走
     */
    public abstract void drive();
    
    /**
     * 定义汽车的一个行为方法 车可以自动巡航
     */
    public abstract void selfNavifation();
    }
  2. 接下来新建“工厂”抽象类

    public abstract class AudiFactory {
    /**
     * 抽象工厂定义抽象方法
     * @param tClass
     * @param <T>
     * @return
     */
    public abstract <T extends AudiCar> T createAudiCar(Class<T> tClass);
    }
  3. 创建具体“产品”类

    • Q3Car.class
    public class Q3Car extends AudiCar {
    private static final String TAG = Q3Car.class.getName();
    
    @Override
    public void drive() {
        System.out.println("Q3启动");
    }
    
    @Override
    public void selfNavifation() {
        System.out.println("Q3开始行驶");
    }
    }
    • Q7Car
    public class Q7Car extends AudiCar {
    private static final String TAG = Q7Car.class.getName();
    
    @Override
    public void drive() {
        System.out.println("Q7启动");
    }
    
    @Override
    public void selfNavifation() {
        System.out.println("Q7开始行驶");
    }
    }
  4. 实现具体工厂

    /**
    * 具体工厂,实现抽象方法
    */
    public class AudiCarFactory extends AudiFactory {
    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> tClass) {
        AudiCar audiCar = null;
        try {
        //通过反射得到
            audiCar = (AudiCar) Class.forName(tClass.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) audiCar;
    }
    }
  5. 实现工厂生产产品

    public class MainClass {
    public static void main(String[] args) {
        //实例化一个具体工厂
        AudiFactory audiFactory = new AudiCarFactory();
        //生产Q3汽车
        Q3Car q3Car = audiFactory.createAudiCar(Q3Car.class);
        q3Car.drive();
        q3Car.selfNavifation();
    
        //生产Q7汽车
        Q7Car q7Car = audiFactory.createAudiCar(Q7Car.class);
        q7Car.drive();
        q7Car.selfNavifation();
    
    }
    }
  6. 输出结果

    Q3启动
    Q3开始行驶
    Q7启动
    Q7开始行驶

该模式实现比较简单,主要可以注意到面向抽象、面向接口编程,另外需要注意的一点是使用了反射机制获得类实例。该模式也存在缺点:当“产品”变多,我们的产品类会一直增加,造成类数量的臃肿,另外还要引入抽象层,这一点也是需要注意的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值