前言:本文是在学习了Jdon论坛的《GoF 23种设计模式》基础上,个人总结而成,感谢Jdon的无私奉献
工厂模式的实现可以归纳为以下四种:
1.public class CarFactory{
public static Car getCar(int type){
if(type == 1){
return new Car1();
} else {
return new Car2();
}
}
}
2. public class CarFactory{
public static Car getCar(String carClass){
String className = carClass;
Class c = Class.forName(className);
Car car = (Car)c.newInstance();
return car;
}
}
3. public class CarFactory{
public static Car getCar(String carJNDIName){
InitialContext ic = new InitialContext();
String className = ic.lookUp(carJNDIName);
Car car = (Car)Class.forName(className).newInstance();
return car;
}
}
4. public abstract class AbstractFactory{
public abstract Car getCar(String carClass);
public abstract Plane getPlane(String planeClass);
}
public class Factory1 extends AbstractFactory{
public Car getCar(String carClass){
// 参考上面的方式1~3
return car1;
}
public Plane getPlane(String planeClass){
// 参考上面的方式1~3
return plane1;
}
}
public class Factory2 extends AbstractFactory{
public Car getCar(String carClass){
// 参考上面的方式1~3
return car2;
}
public Plane getPlane(String planeClass){
// 参考上面的方式1~3
return plane2;
}
}
工厂模式的实现可以归纳为以下四种:
1.public class CarFactory{
public static Car getCar(int type){
if(type == 1){
return new Car1();
} else {
return new Car2();
}
}
}
2. public class CarFactory{
public static Car getCar(String carClass){
String className = carClass;
Class c = Class.forName(className);
Car car = (Car)c.newInstance();
return car;
}
}
3. public class CarFactory{
public static Car getCar(String carJNDIName){
InitialContext ic = new InitialContext();
String className = ic.lookUp(carJNDIName);
Car car = (Car)Class.forName(className).newInstance();
return car;
}
}
4. public abstract class AbstractFactory{
public abstract Car getCar(String carClass);
public abstract Plane getPlane(String planeClass);
}
public class Factory1 extends AbstractFactory{
public Car getCar(String carClass){
// 参考上面的方式1~3
return car1;
}
public Plane getPlane(String planeClass){
// 参考上面的方式1~3
return plane1;
}
}
public class Factory2 extends AbstractFactory{
public Car getCar(String carClass){
// 参考上面的方式1~3
return car2;
}
public Plane getPlane(String planeClass){
// 参考上面的方式1~3
return plane2;
}
}
从上面的4种方式来看,方式1~3适合于工厂所产生的对象都是属于同一个父类型的,而方式4则适合于工厂需要产生多种类型的产品,而每一种类型的产品下面又有多个子类型的情况。
而从方式1~3来看,方式1无疑是最简单的,也是最容易理解和接受的,而方式2和方式3则相对来说要高级一点。高级在哪里呢?我们可以看到,方式1中对对象的创建是使用Hardcode的形式,也即是程序员需要事先知道系统里面存在多少个类型的对象及其对应的编号,一旦增加或删除、修改了对象的类型,则必然引起if-else块的改变,造成了维护的困难。
而方式2则采用了动态类加载的方式,方式3在方式2的基础上使用了JNDI,更进了一步,其好处是不用出现HardCode的方式,即便你后面的应用增加、删除了对象的类型,我的程序还是保持现在的样子,跟进一步来说:可以去掉那些讨厌的if-else语句。
方式4是最为复杂而且也是最为强大的一种,它在实现了对象工厂抽象的基础上,又集成了工厂方法。使到不同的工厂可以生产相同类型的产品,但产品的子类可能有所不同。就像上面的工厂1和工厂2都可以生产汽车和飞机一样,他们各自之间可以生产不同系列的产品(抽象工厂),而且每个系列下面可能有不同的型号(工厂方法)。