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();
}
}
运行结果:
—–华北造车厂工作:——-
造出一台汽车!
造出一台拖拉机!
造出一台火车!
——-东北造车厂工作:——–
造出一台汽车!
造出一台拖拉机!
造出一台火车!
至此,工厂的三种设计模式都介绍过了,简单工厂,工厂方法,抽象工厂他们后者总比前者更抽象,更具有一般性,但是在学习过程中我们应该更关注他们使用场合以及引入这种模式的用意。
分享到:
相关推荐
java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式
IOS 设计模式抽象工厂实例Demo IOS 设计 模式 抽象 工厂
抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式
设计模式,AbstractFactory,抽象工厂模式
1、抽象工厂模式+反射技术 2、抽象工厂模式+简单工厂模式 3、仅仅是抽象工厂模式
工厂方法模式和抽象工厂模式的区别,对工厂方法模式和抽象工厂模式做了简单的比较
.net抽象工厂+存储过程添加数据(详情教程) 1、web.config配置连接、数据库类型 2、创建抽象工厂、判断连接数据库, 3、在连接的数据库中继承抽象工厂,重写抽象工厂里的接口方法,返回到数据访问层。 4、在接口层...
java设计模式【之】抽象工厂模式【源码】【场景:制作咖啡】 * 抽象工厂 * * 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。 * 在工厂方法的基础上,进一步抽象工厂...
介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
实现抽象工厂多层架构,用到反射机制,实现报表查询,本资源是我的一个机试题,可以现套现用
设计模式-抽象工厂模式(讲解及其实现代码)
4.简单工厂-工厂方法-抽象工厂 对比总结
c#三层+抽象工厂实现+类似抽象工厂反射实现 大家可以看看,很不错,顺便做个广告,希望大家愿意交流的加小弟qq 9480007, 也可以进qq群 46301976 或 76055852
设计模式--抽象工厂模式实现多数据库连接 设计模式,.net设计模式,抽象工厂
抽象工厂模式ppt。抽象工厂模式ppt。抽象工厂模式ppt。
抽象工厂,一个很容易理解的案例,大家可以看一看
抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建...
设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂...
软件体系结构课程的抽象工厂试验报告,是利用了java语言编写的源代码。
抽象工厂模式(Abstract Factory Pattern) 引入: 在前面介绍的两个创建型模式里面,我们解决的都是有关"new"的问题,用它们来避免显式指定类创建对象。我写的也非常简单易懂,相信看过的朋友们都应该对简单工厂...