工厂模式分为三种情况:简单工厂模式,工厂方法模式,抽象工厂模式,根据不同的场景选择相应的模式。
简单工厂模式用于生产单一的产品,一般使用静态方法,根据传入的参数返回不同的对象实例。
工厂方法模式,定义一个用于创建对象的接口,让子类决定创建哪个类,它使一个类型实例化延长到了子类。
抽象方法模式,提供一系列创建相关或相互依赖对象的接口,而无需指定它们具体的类,通俗点说就是,一个工厂要生产多个产品,例如一个汽车厂要生产轮胎,生产照明灯,但是轮胎和照明灯又有不同的品牌。
简单工厂模式的实现
首先,一个Widget的接口,
public interface Widget {
public void show();
}
其次,一个4x1和一个4x2的widget,
public class FourOneWidget implements Widget {
public void show() {
System.out.println("4x1 widget");
}
}
public class FourTwoWidget implements Widget {
public void show() {
System.out.println("4x2 wiget");
}
}
最后,来个创建Widget的工厂,
public class WidgetFactory {
public static final String FOUR_ONE_TYPE = "4x1";
public static final String FOUR_TWO_TYPE = "4X2";
public static Widget createWidget(String type) {
if(FOUR_ONE_TYPE.equals(type)) {
return new FourOneWidget();
} else if(FOUR_TWO_TYPE.equals(type)) {
return new FourTwoWidget();
}
return null;
}
}
这样一个简单的工厂方法就实现了,我们可以调用WidgetFactory的static方法来创建不同的Widget,但是每次调用都需要修改代码,也就是传递的参数type。
工厂方法模式的实现
首先,Widget以及FourOneWidget,FourTwoWidget的代码都是一样的(工厂方法的重点不是产品,而是生产产品的方式-_-),在这里对工厂做了抽象,然后派生出两个分别生产4x1和4x2widget的工厂,代码如下:
public interface WidgetFactory {
public Widget createFactory();
}
public class FourOneWidgetFactory implements WidgetFactory {
public Widget createFactory() {
return new FourOneWidget();
}
}
public class FourTwoWidgetFactory implements WidgetFactory {
public Widget createFactory() {
return new FourTwoWidget();
}
}
这时候,我们再调用的时候就可以根据需求调用FourOneWidgetFactory或者FourTwoFactory了,而不用再修改代码。
抽象工厂方法的实现
首先一些需要生产的产品的类:
public interface Lamp {
public void brand();
}
public class DZLamp implements Lamp {
public void brand() {
System.out.println("DZ Lamp");
}
}
public class BMLamp implements Lamp {
public void brand() {
System.out.println("BM Lamp");
}
}
public interface Wheel {
public void brand();
}
public class DZWheel implements Wheel {
public void brand() {
System.out.println("DZ wheel");
}
}
public class BMWheel implements Wheel {
public void brand() {
System.out.println("BM wheel");
}
}
然后是不同的工厂,
public abstract class BMFactory {
public abstract Wheel createBMWhell();
public abstract Lamp createBMLamp();
}
public class BMOneFactory extends BMFactory {
public Wheel createBMWhell() {
return new BMWheel();
}
public Lamp createBMLamp() {
return new BMLamp();
}
}
public abstract class DZFactory {
public abstract Lamp createDZLamp();
public abstract Wheel createDZWheel();
}
public class DZOneFactory extends DZFactory {
public Lamp createDZLamp() {
return new DZLamp();
}
public Wheel createDZWheel() {
return new DZWheel();
}
}
最后,不同品牌的工厂生产相应的产品了。。