工厂模式在《Java与模式》中分为三类:
1)简单工厂模式(Simple Factory):不利于产生系列产品;
2)工厂方法模式(Factory Method):又称为多形性工厂;
3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
这三种模式从上到下逐步抽象,并且更具一般性。
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
二、简单工厂模式
简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
1)简单工厂模式(Simple Factory):不利于产生系列产品;
2)工厂方法模式(Factory Method):又称为多形性工厂;
3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
二、简单工厂模式
简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。
三、工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
来看下它的组成:
interface Car {
public void run();
public void stop();
}
class Bmw implements Car{
public void run(){
System.out.println("bmw is running...");
}
public void stop(){
System.out.println("bmw is stopping...");
}
}
class Ford implements Car{
public void run(){
System.out.println("ford is running...");
}
public void stop(){
System.out.println("ford is stopping...");
}
}
上述有个Car接口,有Bmw,Ford类实现Car接口.
class Factory{ public static Car getInstance(String name){ Car car = null; if("Bmw".equals(name)){ car = new Bmw(); }else { car = new Ford(); } return car; } }
如果有100种车实现Car接口的话,那样要判断100个if语句。所以就出现了工厂模式通过字节码来创建对象。
即修改代码如下:
class Factory{
public static Car getInstance(String name){
Car car = null;
try {
car = (Car) Class.forName(name).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return car;
}
}
然后再测试类中想创建Bmw对象就直接
Bmw bmw = (Bmw) Factory.getInstance("com.jxau.demo.Bmw");//括号里面是类的全名。
这样就可以随便创建只要实现Car接口的对象。
这就是工厂模式的好处。