设计模式-工厂模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景:在任何需要生成复杂对象的地方,都可以使用工厂模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

UML类图


主要分为四大模块:
1、抽象工厂,其为工厂模式的核心
2、具体工厂,其实现了具体的业务逻辑
3、抽象产品,是工厂模式所创建产品父类
4、具体产品,为实现抽象产品的某个具体产品对象。

上述也可以是一个工厂生产多种产品ConcreteProductA、ConcreteProductB;也可以使用多个工厂生产多个产品ConcreteFactoryA工厂生产ConcreteProductA,ConcreteFactoryB工厂生产ConcreteProductB;多个工厂的方式叫多工厂方法模式;
如果只有一个工厂的时候,工厂的抽象类也可以简化掉,只需要把具体工厂的方法createProduct() 改为静态方法即可。
像这样的只有一个具体工厂的方式称为简单工厂模式。

简单实现
汽车生产厂商要生产三种类型的车辆Q3、Q5、Q7,这三张车内部结构差异并不是很大,如果是一条生产线可以满足对三款车辆的生产。

如果不使用设计模式,要完成以上的需求,就需要在一个类中有一个生产汽车的方法,在这个方法中用if else判断不同类型的汽车,然后new实例对象之后返回。
如果采用工厂模式,就没有了if else,降低了耦合度,也便于以后可以生产更多结构相同款式不同的汽车比如Q8、Q9等。无需改动原代码即可实现。

一个抽象工厂类
/**
 * 抽象的工厂类
 */
public abstract class AudiFactory {
    /**
     * 生产某车型的方法
     *
     * @param clz 具体的汽车型号
     * @param <T>
     * @return
     */
    public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);

}

一个具体工厂类
/**
 * 具体的生产工厂
 */
public class AudiCarFactory extends AudiFactory {

    /**
     * 完成生产汽车的方法逻辑
     * @param clz 具体的汽车型号
     * @param <T>
     * @return
     */
    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {
            car = (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }

}


汽车抽象类
/**
 * 汽车的抽象产品
 */
public abstract class 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 Client {
    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();
    }
}


Android源码中的工厂模式使用
android里Activity的各个生命周期方法,以onCreate为例,就可以看作一个工厂方法,我们在其中可以构造我们的View并通过setContentView返回给framework处理。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值