设计模式-工厂模式
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处理。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮