设计模式-工厂模式

2019-04-14 21:15发布

定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。使用场景:在任何需要生成复杂对象的地方,都可以使用工厂模式。复杂对象适合使用工厂模式,用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处理。