`

抽象工厂

 
阅读更多

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();

    }

}

运行结果:

—–华北造车厂工作:——-
造出一台汽车!
造出一台拖拉机!
造出一台火车!
——-东北造车厂工作:——–
造出一台汽车!
造出一台拖拉机!
造出一台火车!

至此,工厂的三种设计模式都介绍过了,简单工厂,工厂方法,抽象工厂他们后者总比前者更抽象,更具有一般性,但是在学习过程中我们应该更关注他们使用场合以及引入这种模式的用意。
分享到:
评论

相关推荐

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    抽象工厂模式代码

    抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在实际应用中,当我们需要创建一组具有共同特性的对象,而这些对象分别...

    IOS 设计模式抽象工厂实例Demo

    抽象工厂模式是设计模式中的一种,尤其适用于创建一组相关或相互依赖的对象。这个实例Demo将向我们展示如何在iOS环境中应用抽象工厂模式。 抽象工厂模式的核心思想是提供一个接口,用于创建一系列相关或相互依赖的...

    C# Winform抽象工厂架构

    "C# Winform抽象工厂架构"是一个基于C#语言和Windows Forms(Winform)平台,利用抽象工厂设计模式构建的多层架构项目。在这个项目中,开发者使用了抽象工厂模式来创建和管理报表查询的相关组件,同时结合了反射机制...

    抽象工厂模式+反射技术(抽象工厂模式+简单工厂模式)

    抽象工厂模式是设计模式中的一种,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在软件工程中,当系统需要在运行时选择不同的产品族时,或者想要隔离具体产品的实现细节时,抽象工厂...

    抽象工厂模式uml类图

    java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式

    设计模式抽象工厂实验报告

    ### 抽象工厂模式实验报告知识点解析 #### 实验背景及目标 本次实验报告来源于南京工程学院软件设计与体系结构课程。实验的核心在于理解和实践**抽象工厂模式**,这是一种常用的面向对象设计模式,旨在解决软件...

    简单工厂和抽象工厂的Demo

    在软件设计模式中,"简单工厂"和"抽象工厂"是两种常见的创建型设计模式,它们主要用于对象的创建。这两种模式都是为了将对象的创建过程封装起来,使得客户端代码无需关心具体的实现细节,只需调用工厂提供的接口即可...

    抽象工厂模式案例代码

    抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,它表示一系列相关或相互依赖的对象。在不指定具体类的情况下,抽象工厂模式使得...

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

    简单工厂-工厂方法-抽象工厂 对比总结

    本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...

    .NET开发三层版抽象工厂小案例

    在这个“.NET开发三层版抽象工厂小案例”中,我们将探讨如何运用抽象工厂模式来实现各层之间的交互。 抽象工厂模式是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。...

    简单工厂模式-工厂方法模式-抽象工厂模式

    在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...

    工厂方法模式和抽象工厂模式的区别

    工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...

    java设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统有多个产品族,而每个产品族又有多个具体产品时,如何组织代码的问题。在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于...

    设计模式--抽象工厂模式实现多数据库连接

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...

    肯德基:抽象工厂模式

    抽象工厂模式是软件工程中常用的一种创建型设计模式,它的核心思想是为创建一组相关或相互依赖的对象提供一个接口,而不需要指定它们具体的类。在Java中,抽象工厂模式被广泛应用,它有助于整合代码,提高系统的可...

    c#三层+抽象工厂实现+类似抽象工厂反射实现

    在给定的标题和描述中,主要涉及了两种设计模式:三层架构(Three-Tier Architecture)和抽象工厂模式(Abstract Factory Pattern),以及C#中的反射(Reflection)技术。下面将详细阐述这三个知识点。 首先,**三...

    抽象工厂的介绍应用

    抽象工厂模式是设计模式中的一种,属于创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于"抽象工厂",它是一个接口或者抽象类,定义了创建一系列相关或相互依赖对象的接口,而...

Global site tag (gtag.js) - Google Analytics