前言
工厂方法模式是创建型模式,多用于需要生成复杂对象的地方。工厂模式降低了对象之间的耦合度,实例化的任务交由子类去完成,所以具备很好的扩展性。
定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。
简单实现
这里以一个生活中的小例子来说明。小民是一家汽车厂的厂长,对他来说,组装汽车没什么好神秘的,无非就是将一些进口的核心部件,比如发动机和一些国内的零部件组装起来,小民的汽车厂主要就是组装某款SUV车型,比如Q3、Q5、Q7,对于这类车型来说,内部结构差异并不是很大,因此,对小民来说,一条生产线足以应付这3种车型,对于该类生产线小民提供了一个抽象类定义:
public abstract class AbsAudiFactory {
/**
* 某车型的工厂方法
*
* * @param clazz 具体的SUV型号类型
*
* * @return 具体型号的SUV车对象
*/
public abstract <T extends AudiCar> T createAudiCar(Class<T> clazz);
}
在这里,小民厂里所生产的3种SUV车型可能在主结构上并没有什么差异,因此,对于小民来说没有必要为每一种车型都提供一条不同的生产线,所以一条生产线即可:
public class AudiCarFactory extends AbsAudiFactory {
@Override
public <T extends AudiCar> T createAudiCar(Class<T> clazz) {
AudiCar audiCar = null;
try {
audiCar = (AudiCar) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) audiCar;
}
}
对于这3种车型,除了一些车都有的基本共性外,还提供了自动巡航功能,类似于无人驾驶,这些功能小民都使用一个抽象的基类来声明:
public abstract class AudiCar {
/**
汽车的抽象产品类
* 定义汽车的一个行为方法 车可以启动开走
*/
public abstract void drive();
//定义汽车的一个行为方法 车可以自动巡航
public abstract void selfNavigation();
}
再接下来就是生产每一种具体的车型了:
//Q3
public class AudiQ3 extends AudiCar {
@Override
public void drive() {
System.out.println(" Q3 启动啦!");
}
@Override
public void selfNavigation() {
System.out.println(" Q3 开始自动巡航!");
}
}
//Q5
public class AudiQ5 extends AudiCar{
@Override
public void drive() {
System.out.println(" Q5 启动啦!");
}
@Override
public void selfNavigation() {
System.out.println(" Q5 开始自动巡航!");
}
}
//Q7
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) {
AbsAudiFactory factory = new AudiCarFactory();
AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
audiQ3.drive();
audiQ3.selfNavigation();
AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
audiQ5.drive();
audiQ5.selfNavigation();
AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
audiQ7.drive();
audiQ7.selfNavigation();
}}
输出结果如下:
Q3 启动啦!
Q3 开始自动巡航!
Q5 启动啦!
Q5 开始自动巡航!
Q7 启动啦!
Q7 开始自动巡航
总结
总的来说,工厂方法模式是一个很好的设计模式,在本文多处地方都有对其优点进行总结,但是缺点也是难以避免的,每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否要使用工厂模式,需要设计者权衡利弊了。
网友评论