JAVA设计模式浅析6——抽象工厂模式
前面我们介绍了简单工厂,工厂方法模式,这节来看看抽象工厂模式,抽象工厂模式(Abstract Factory)是工厂方法里面最为抽象和最具一般性的形态,是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。抽象工厂模式和工厂方法模式的最大区别在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品族,从而使得产品具有二维性质。抽象工厂模式的一般示意类图如下:
AbstractFactory
AbstractFactory
下面我们先看抽象工厂的角色都有哪些:
抽象工厂(Creator)角色:是抽象工厂模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
如果你很留心,你就发现抽象工厂的角色和工厂方法的角色一样,其实抽象工厂就是在工厂方法的基础上进一步推广。
下面我们来举实例说明,我们还是延续车的例子,我们说我们原有的造车厂扩建,分东北重工厂和华北机械厂,这两个厂都可以造拖拉机,汽车,火车,但是他们在工艺和品牌上都有所不同,我们抽象出以下模型:
AbstractFactory
abstractFactory
通过上图,我们可以看出,我们系统模型中有个两个产品族,一个产品族是东北重工厂产出的所有产品,另一个产品族是华北机械厂生产出的所有产品。我们也可以看出有多少个实现工厂就有多少个产品族,在工厂角色中有多少工厂方法在同一个产品族类就有多少个具体产。
举例代码如下:
package com.pattern.abstractFactory;
/**
*
*【描述】:抽象类 车
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryMachine.java
*
*/
public abstract class TrafficMachine {
public float power ;
public float load ;
/**
*
*【描述】:运输
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public abstract void traffic();
}
package com.pattern.abstractFactory;
/**
*
*【描述】:汽车类
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryAutomobile.java
*
*/
public class Automobile extends TrafficMachine{
public Automobile(){
super();
System.out.println("造出一台汽车!");
}
@Override
public void traffic() {
// TODO Auto-generated method stub
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:拖拉机
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryTractor.java
*
*/
public class Tractor extends TrafficMachine{
public Tractor(){
super();
System.out.println("造出一台拖拉机!");
}
@Override
public void traffic() {
// TODO Auto-generated method stub
}
/**
*
*【描述】:耕地
*【作者】:alaric
*【时间 】:May 20, 2012
*
*/
public void plough(){
System.out.println("拖拉机在耕地了");
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:火车
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryTrain.java
*
*/
public class Train extends TrafficMachine {
private int nodeNum = 20; //节数
private String trainNum = "T54"; //车次
public Train(){
super();
System.out.println("造出一台火车!");
}
@Override
public void traffic() {
// TODO Auto-generated method stub
}
public int getNodeNum() {
return nodeNum;
}
public void setNodeNum(int nodeNum) {
this.nodeNum = nodeNum;
}
public String getTrainNum() {
return trainNum;
}
public void setTrainNum(String trainNum) {
this.trainNum = trainNum;
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:抽象工厂类
*【作者】:alaric
*【时间】:Jul 1, 2012
*【文件】:com.pattern.abstractFactory.Factory.java
*
*/
public interface Factory {
/**
*
*【描述】:汽车工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public Automobile AutomobileFactory();
/**
*
*【描述】:拖拉机工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public Tractor TractorFactory();
/**
*
*【描述】:火车工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public Train TrainFactory();
}
package com.pattern.abstractFactory;
/**
*
*【描述】:华北工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*【文件】:com.pattern.abstractFactory.NCFactory.java
*
*/
public class NCFactory implements Factory{
public NCFactory(){
super();
System.out.println("-----华北造车厂工作:-------");
}
@Override
public Automobile AutomobileFactory() {
// TODO Auto-generated method stub
return new Automobile();
}
@Override
public Tractor TractorFactory() {
// TODO Auto-generated method stub
return new Tractor();
}
@Override
public Train TrainFactory() {
// TODO Auto-generated method stub
return new Train();
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:东北工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*【文件】:com.pattern.abstractFactory.NortheastFactory.java
*
*/
public class NortheastFactory implements Factory{
public NortheastFactory(){
super();
System.out.println("-------东北造车厂工作:--------");
}
@Override
public Automobile AutomobileFactory() {
// TODO Auto-generated method stub
return new Automobile();
}
@Override
public Tractor TractorFactory() {
// TODO Auto-generated method stub
return new Tractor();
}
@Override
public Train TrainFactory() {
// TODO Auto-generated method stub
return new Train();
}
}
package com.pattern.abstractFactory;
public class Client {
/**
*【描述】:测试
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public static void main(String[] args) {
//华北机械厂造车
Factory factory = new NCFactory();
factory.AutomobileFactory();
factory.TractorFactory();
factory.TrainFactory();
//华北机械厂造车
factory = new NortheastFactory();
factory.AutomobileFactory();
factory.TractorFactory();
factory.TrainFactory();
}
}
运行结果:
—–华北造车厂工作:——-
造出一台汽车!
造出一台拖拉机!
造出一台火车!
——-东北造车厂工作:——–
造出一台汽车!
造出一台拖拉机!
造出一台火车!
至此,工厂的三种设计模式都介绍过了,简单工厂,工厂方法,抽象工厂他们后者总比前者更抽象,更具有一般性,但是在学习过程中我们应该更关注他们使用场合以及引入这种模式的用意。
前面我们介绍了简单工厂,工厂方法模式,这节来看看抽象工厂模式,抽象工厂模式(Abstract Factory)是工厂方法里面最为抽象和最具一般性的形态,是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。抽象工厂模式和工厂方法模式的最大区别在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品族,从而使得产品具有二维性质。抽象工厂模式的一般示意类图如下:
AbstractFactory
AbstractFactory
下面我们先看抽象工厂的角色都有哪些:
抽象工厂(Creator)角色:是抽象工厂模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
如果你很留心,你就发现抽象工厂的角色和工厂方法的角色一样,其实抽象工厂就是在工厂方法的基础上进一步推广。
下面我们来举实例说明,我们还是延续车的例子,我们说我们原有的造车厂扩建,分东北重工厂和华北机械厂,这两个厂都可以造拖拉机,汽车,火车,但是他们在工艺和品牌上都有所不同,我们抽象出以下模型:
AbstractFactory
abstractFactory
通过上图,我们可以看出,我们系统模型中有个两个产品族,一个产品族是东北重工厂产出的所有产品,另一个产品族是华北机械厂生产出的所有产品。我们也可以看出有多少个实现工厂就有多少个产品族,在工厂角色中有多少工厂方法在同一个产品族类就有多少个具体产。
举例代码如下:
package com.pattern.abstractFactory;
/**
*
*【描述】:抽象类 车
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryMachine.java
*
*/
public abstract class TrafficMachine {
public float power ;
public float load ;
/**
*
*【描述】:运输
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public abstract void traffic();
}
package com.pattern.abstractFactory;
/**
*
*【描述】:汽车类
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryAutomobile.java
*
*/
public class Automobile extends TrafficMachine{
public Automobile(){
super();
System.out.println("造出一台汽车!");
}
@Override
public void traffic() {
// TODO Auto-generated method stub
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:拖拉机
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryTractor.java
*
*/
public class Tractor extends TrafficMachine{
public Tractor(){
super();
System.out.println("造出一台拖拉机!");
}
@Override
public void traffic() {
// TODO Auto-generated method stub
}
/**
*
*【描述】:耕地
*【作者】:alaric
*【时间 】:May 20, 2012
*
*/
public void plough(){
System.out.println("拖拉机在耕地了");
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:火车
*【作者】:alaric
*【时间 】:May 20, 2012
*【文件】:com.pattern.SimpleFactoryTrain.java
*
*/
public class Train extends TrafficMachine {
private int nodeNum = 20; //节数
private String trainNum = "T54"; //车次
public Train(){
super();
System.out.println("造出一台火车!");
}
@Override
public void traffic() {
// TODO Auto-generated method stub
}
public int getNodeNum() {
return nodeNum;
}
public void setNodeNum(int nodeNum) {
this.nodeNum = nodeNum;
}
public String getTrainNum() {
return trainNum;
}
public void setTrainNum(String trainNum) {
this.trainNum = trainNum;
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:抽象工厂类
*【作者】:alaric
*【时间】:Jul 1, 2012
*【文件】:com.pattern.abstractFactory.Factory.java
*
*/
public interface Factory {
/**
*
*【描述】:汽车工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public Automobile AutomobileFactory();
/**
*
*【描述】:拖拉机工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public Tractor TractorFactory();
/**
*
*【描述】:火车工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public Train TrainFactory();
}
package com.pattern.abstractFactory;
/**
*
*【描述】:华北工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*【文件】:com.pattern.abstractFactory.NCFactory.java
*
*/
public class NCFactory implements Factory{
public NCFactory(){
super();
System.out.println("-----华北造车厂工作:-------");
}
@Override
public Automobile AutomobileFactory() {
// TODO Auto-generated method stub
return new Automobile();
}
@Override
public Tractor TractorFactory() {
// TODO Auto-generated method stub
return new Tractor();
}
@Override
public Train TrainFactory() {
// TODO Auto-generated method stub
return new Train();
}
}
package com.pattern.abstractFactory;
/**
*
*【描述】:东北工厂
*【作者】:alaric
*【时间】:Jul 1, 2012
*【文件】:com.pattern.abstractFactory.NortheastFactory.java
*
*/
public class NortheastFactory implements Factory{
public NortheastFactory(){
super();
System.out.println("-------东北造车厂工作:--------");
}
@Override
public Automobile AutomobileFactory() {
// TODO Auto-generated method stub
return new Automobile();
}
@Override
public Tractor TractorFactory() {
// TODO Auto-generated method stub
return new Tractor();
}
@Override
public Train TrainFactory() {
// TODO Auto-generated method stub
return new Train();
}
}
package com.pattern.abstractFactory;
public class Client {
/**
*【描述】:测试
*【作者】:alaric
*【时间】:Jul 1, 2012
*
*/
public static void main(String[] args) {
//华北机械厂造车
Factory factory = new NCFactory();
factory.AutomobileFactory();
factory.TractorFactory();
factory.TrainFactory();
//华北机械厂造车
factory = new NortheastFactory();
factory.AutomobileFactory();
factory.TractorFactory();
factory.TrainFactory();
}
}
运行结果:
—–华北造车厂工作:——-
造出一台汽车!
造出一台拖拉机!
造出一台火车!
——-东北造车厂工作:——–
造出一台汽车!
造出一台拖拉机!
造出一台火车!
至此,工厂的三种设计模式都介绍过了,简单工厂,工厂方法,抽象工厂他们后者总比前者更抽象,更具有一般性,但是在学习过程中我们应该更关注他们使用场合以及引入这种模式的用意。