1.工厂模式的定义
工厂模式使用的频率非常高,我们在开发中总能见到它们的身影。其定义为:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.即定义一个用于创建对象的接口,让子类决定实例化哪一个类。
2 静态工厂模式
案列:
造车
比亚迪汽车
型号:秦 唐 宋
想要什么型号告诉工厂,工厂直接就给你造什么样型号的车
UML:
代码:
/**
* 车
* @author pengkun
*
*/
public interface Car {
void getCar();
}
/**
* 秦
* @author pengkun
*
*/
public class QinCar implements Car {
@Override
public void getCar() {
System.out.println("制造了一辆比亚迪秦");
}
}
/**
* 宋
* @author pengkun
*
*/
public class SongCar implements Car {
@Override
public void getCar() {
System.out.println("制造了一辆比亚迪宋");
}
}
/**
* 唐
* @author pengkun
*
*/
public class TangCar implements Car {
@Override
public void getCar() {
System.out.println("制造了一辆比亚迪唐");
}
}
工厂:这里用的反射
/**
* 车厂
* @author pengkun
*
*/
public interface CarFactory {
//造车
<T extends Car>T createCar(Class<T> clazz);
}
/**
* byd造车厂
* @author pengkun
*
*/
public class BYDFactory implements CarFactory {
@SuppressWarnings("unchecked")
@Override
public <T extends Car> T createCar(Class<T> clazz) {
Car car=null;
try {
car=(Car) Class.forName(clazz.getName()).newInstance();
}catch (Exception e) {
System.out.println("造车失败...");
}
return (T)car;
}
}
测试:
@Test
public void test() {
CarFactory factory=new BYDFactory();
Car carQ=factory.createCar(QinCar.class);
Car carT=factory.createCar(TangCar.class);
carQ.getCar();
carT.getCar();
}
结果:
制造了一辆比亚迪秦
制造了一辆比亚迪唐
总结:这就是静态工厂模式,在实际项目中,根据需求可以设置成静态工厂类,但是缺点是扩展比较困难,如果就一个工厂,不需要扩展,可以这么设计,仍然是很常用的。
仔细想想三个型号的车都只有工厂制造,那工厂压力太大,就多弄几个工厂一个工厂造一种型号吧
多个工厂模式
UML:
代码:
其他都不变工厂改一改
/**
* 车厂
* @author pengkun
*
*/
public interface CarFactory2 {
//造车
Car createCar();
}
/**
* 秦工厂
* @author pengkun
*
*/
public class QinFactory implements CarFactory2 {
@Override
public Car createCar() {
return new QinCar();
}
}
//后面都一样同理就省略了。。
测试:
@Test
public void test2() {
Car carQ=new QinFactory().createCar();
Car carT=new TangFactory().createCar();
carQ.getCar();
carT.getCar();
}
结果
制造了一辆比亚迪秦
制造了一辆比亚迪唐
总结:这种工厂模式的好处是职责清晰,结构简单,但是给扩展性和可维护性带来了一定的影响,因为如果要扩展一个产品类,就需要建立一个相应的工厂类,这样就增加了扩展的难度。因为工厂类和产品类的数量是相同的,维护时也需要考虑两个对象之间的关系。但是这种模式还是很常用的。