简单工厂模式又称静态工厂方法模式.
实质是“工厂方法模式的一个特例,定义了一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行."
下列情况可以考虑使用工厂方法模式:
创建对象需要大量重复的代码。
创建对象需要访问某些信息,而这些信息不应该包含在复合类中。
创建对象的生命周期必须集中管理,以保证在整个程序中具有一致的行为。
一个汽车接口类,包含启动和停止两个方法:
public interface Car {
public void run();
public void stop();
}
現在要生产三辆车,它们都实现接口Car里的run和stop方法,并有自己的行为特征,这里为了简单就各打印一句话.
奔驰:
public class Benz implements Car {
@Override
public void run() {
System.out.println("Benz 奔驰启动了...");
}
@Override
public void stop() {
System.out.println("Benzͣ 奔驰停止了...");
}
}
福特:
public class Ford implements Car {
@Override
public void run() {
System.out.println("Ford 福特启动了...");
}
@Override
public void stop() {
System.out.println("Fordͣ 福特停止了...");
}
}
丰田:
public class Toyota implements Car {
@Override
public void run() {
System.out.println("Toyota 丰田启动了...");
}
@Override
public void stop() {
System.out.println("Toyotaͣ 丰田停止了...");
}
}
虽然说要生产三辆汽车,但是没有汽车工厂怎么生产呢?对,现在需要一个生产汽车的工厂类:
public class CarFactory {
public static Car newCarInstance(String type)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
// 使用反射得到具体的实现类
// 实现工厂和具体实现类分离,只需添加具体实现类即可,无需改动工厂类
return (Car) Class.forName(type).newInstance();
}
}
我们看到这个生产汽车的工厂类实例化对象是通过反射机制实现的,并根据参数的不同选择实现不同的具体对象,这有什么好处呢?
好处就是,我们如果要生产一辆宝马的话,就只要创建一个宝马的实体类并实现接口Car即可.
这个工厂类不需要由每个具体产品实现一个自己的具体的工厂类(工厂方法模式需要此步骤),所以可以将工厂方法设置为静态方法。 而且,工厂方法封装了对象的创建过程。
其实上面的代码应该还要添加一个私有的构造方法.
下面贴测试代码:
@Test
public void test3() throws Exception {
Car c = CarFactory.newCarInstance("Toyota");
if (c != null) {
c.run();
c.stop();
} else {
System.out.println("没有对应车型...");
}
}
输出: