Java中的工厂模式(1)

2014-11-24 03:03:11 · 作者: · 浏览: 0

现在已经有Car类,有Plane类。

现在做为Client,可以直接new Car,new Plane。

但如果还有其他许多交通工具,我们在客户端就是new A ,new B, new C......然后调用a.x,b.x,c.x

所以们,我们想灵活更换交通工具的话,就想到了多态。

于是乎,改为面向接口式的:

Moveable.java

public interface Moveable {

//默认是public

void run();

}

然后其他交通工具从里面继承。就好了。。。

产生的问题:

Car类的实例,是产品。Plane的实例,也是Plane类对应的产品。

而做为客户,直接对产品进行控制,似乎也说得过去,但如果有一个专门来负责管理产品的类,是不是更好了呢?

所以呢,我们引入了CarFactory和PlaneFactory两个类:

public class CarFactory {

public Car createCar(){

return new Car();

}

}

public class PlaneFactory {

public Plane createPalne(){

return new Plane();

}

}

在客户端:

//这样由plane的工厂来产生plane

PlaneFactory pf = new PlaneFactory();

Moveable m = pf.createPalne();

m.run();

CarFactory cp = new CarFactory();

Moveable m2 = cp.createCar();

m2.run();

写到这,我想你已经猜到我下一步该怎么办了。。

想想啊,前面我们解决了灵活调用交通工具的问题,现在,我们就应该解决灵活调用工厂的问题了。。

所以,我们再把工厂抽象出来:这样,就引入抽象工厂这个概念了。

抽象工厂:就是把原工厂的方法再给抽象出来,把具体生产的动作转变为对某个原有的抽象动作的实现。即是由工厂,到了抽象工厂。

以Car为主线:

////也可以用接口,二者均可时,尽量用接口,因为单继承

public abstract class MoveableFactory {

public abstract Moveable create();

}

public class CarFactory extends MoveableFactory{

@Override

public Car create() {

return new Car();

}

}

这样,在客户端,我们只要写:

////直接把PlaneFactory改为CarFactory就可以了。

MoveableFactory mf = new PlaneFactory();

Moveable m = mf.create();

m.run();

如上,我们既满足了客户和产品分开的条件,又满足了灵活调用的条件。不错。。。。

摘自:漂泊小七专栏