工厂方法模式有四种角色:
1:抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的,任何在模式中创建的工厂类必须实现这个接口,这个角色一般有Java接口扮演,在实际的系统中,这个角色也常常使用抽象java类来实现。
2:具体工厂角色:担任着个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
3:抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同富类型或共同拥有的接口。通常由java接口来实现,实际系统中有的时候用java抽象类来实现。
4:具体产品角色:这个角色实现了实现了抽象产品角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
下面按照上面提到的角色来依次介绍:
抽象工厂角色:
/**
*
*/
package com.cn.gd.factory;
/**
* @author sandy
*
*/
//交通工具类充当抽象工厂角色
public abstract class VehicleFactory {
public abstract Moveable create();
}
具体工厂角色:
/**
*
*/
package com.cn.gd.factory;
/**
* @author sandy
* 生产火车的工厂实现了交通工具的抽象工厂
* 在这里担当具体工厂角色
*/
public class TrainFactory extends VehicleFactory {
/* (non-Javadoc)
* @see com.cn.gd.factory.VehicleFactory#create()
*/
@Override
public Moveable create() {
return new Train();
}
}
/**
*
*/
package com.cn.gd.factory;
/**
* @author sandy
* 生产汽车的工厂实现了交通工具的抽象工厂
* 在这里担当具体工厂角色
*/
public class CarFactory extends VehicleFactory {
/* (non-Javadoc)
* @see com.cn.gd.factory.VehicleFactory#create()
*/
@Override
public Moveable create() {
return new Car();
}
}
/**
*
*/
package com.cn.gd.factory;
/**
* @author sandy
* 生产飞机的工厂实现了交通工具的抽象工厂
* 在这里担当具体工厂角色
*/
public class PlaneFactory extends VehicleFactory {
/* (non-Javadoc)
* @see com.cn.gd.factory.VehicleFactory#create()
*/
@Override
public Moveable create() {
return new Plane();
}
}
抽象产品角色:
/**
*
*/
package com.cn.gd.factory;
/**
* @author sandy
* 抽象产品角色
*/
public interface Moveable {
//可以移动
void move();
}
具体产品角色:
package com.cn.gd.factory;
/**
*
* @author sandy
*具体产品角色火车类
*/
public class Train implements Moveable {
public void move() {
System.out.println("the train is moving .................................");
}
}
/**
*
*/
package com.cn.gd.factory;
/**
* @author sandy
* 具体产品角色汽车类
*/
public class Car implements Moveable {
public void move() {
System.out.println("the car is moving .........................");
}
}
package com.cn.gd.factory;
/**
*
* @author sandy
* 具体产品角色飞机类
*/
public class Plane implements Moveable {
public void move() {
System.out.println("the plane is moving .......................");
}
}
客户端程序代码:
/**
*
*/
package com.cn.gd.factory;
/**
* @author sandy
*客户端程序来测试工厂方法模式
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
start();
}
private static void start() {
// VehicleFactory factory=new CarFactory();
// VehicleFactory factory=new PlaneFactory();
VehicleFactory factory=new TrainFactory();
Moveable movetool=factory.create();
movetool.move();
}
}