`
Mr.TianShu
  • 浏览: 29336 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

抽象工厂模式解析例子

阅读更多
抽象工厂模式中的有以下的四种角色:

抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:这个角色用以代表具体的产品。
抽象工厂模式就相当于创建实例对象的new,由于经常要根据类生成实例对象,抽象工厂模式也是用来创建实例对象的,所以在需要新的事例对象时便可以考虑是否使用工厂模式。虽然这样做可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。   
举例来说:生产餐具和相应食物的工厂,有两个车间,其中一个车间用以生产餐具,一个车间用以生产相应的食物。
当消费者消费时,只需要向相应的具体工厂请求具体餐具和具体食物便可以使用餐具消费食物。
使用UML图表示以上的描述如下:

图1抽象工厂与具体工厂

图2抽象餐具与具体餐具(生产车间)

图3抽象食物与具体食物
每个具体工厂生产出来的具体产品根据不同工厂的不同各不相同,但是客户使用产品的方法是一致的。比如客户在得到餐具和食物之后,两者的搭配是正确的(使用汤匙喝牛奶,使用刀子切面包)。
在本例子中有3个具体工厂AKetchen, BKetchen, BKetchen,分别生产牛奶和汤匙、面包和刀、肉和叉子。牛奶、面包和肉都实现了食物接口。汤匙、刀和叉子都实现了餐具接口。
抽象工厂的接口定义如下所示;
      package abstractFactory;
public interface KetchenFactory{
    public Food getFood();
    public TableWare getTableWare();
}
抽象餐具的接口定义如下所示:
package abstractFactory;
public interface TableWare{
  public String getTool();
}
抽象事物的接口定义如下所示:
package abstractFactory;
public interface Food{
    public String getEatable();
}
而具体的实现也非常简单,以AKetchen为例子
具体工厂AKetchen的定义如下所示;
package abstractFactory;
public class AKetchen implements KetchenFactory{
    public Food getFood(){
       return new Milk();
    }
    public TableWare getTableWare(){
       return new Spoon();
    }
}

具体餐具(spoon)的定义如下所示:
package abstractFactory;
public class Spoon implements TableWare{ 
    public String getTool() {
       return "spoon";
    }
}
具体食物(milk)的定义如下所示:
package abstractFactory;
public class Milk implements Food{
    public String getEatable(){
       return "milk";
    }
}
客户端的定义如下:
package abstractFactory;
public class Client{
    public void eat(KetchenFactory k){
       System.out.println("A person eat "+k.getFood().getEatable()
              +" with "+k.getTableWare().getTool()+"!");
    }
    public static void main(String[] args){
       Client client= new Client();
       KetchenFactory kf = new AKetchen();
       client.eat(kf);
       kf=new BKetchen();
       client.eat(kf);
       kf= new CKetchen();
       client.eat(kf);
    }
}
小结:抽象工厂模式特别适合于这样的一种产品结构:产品分为几个系列,在每个系列中,产品的布局都是要同的,在一个系列中某个位置的产品,在另一个系列中一定有一个对应的产品。这样的产品结构是存在的,这几个系列中同一位置的产品可能是互斥的,它们是针对不同客户的解决方案,每个客户都只择其一。
优点:消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。
缺点:当具体产品修改时,相应的工厂类也要做相应的修改。

如果觉得写得好,请一定要支持一下,以给我信心和鼓励把剩下的模式例子写出来。

本文出自 “凌辉” 博客,请务必保留此出处http://tianli.blog.51cto.com/190322/32545

  • 描述: 图3抽象食物与具体食物
  • 大小: 1.5 KB
  • 描述: 图2抽象餐具与具体餐具(生产车间)
  • 大小: 1.6 KB
  • 描述: 图1抽象工厂与具体工厂
  • 大小: 2 KB
分享到:
评论
3 楼 geniuszhe 2009-07-05  
初学设计模式,很多内容都不太理解,主要是接触的实例比较少,看了此贴有种豁然开朗的感觉,感谢楼主
2 楼 gavenbeyond 2008-09-22  
受教了!
1 楼 xixix2004 2008-08-13  
你所说的“一对一”的情况叫做类的“并层”结构,这样的结构也适用于工厂方法。

工厂方法和抽象方法的区别,个人认为:
工厂方法产生的是同一基类的子类的实例,而抽象工厂产生的是同一功能模块下所有相互关联的类的实例。
两者的前提条件是一样的:即都非客户端行为,客户端只负责索取实例,而生成什么类的实例由“工厂”决定。

相关推荐

    C#设计模式:抽象工厂实例解析.7z

    在C#中,我们可以利用抽象工厂模式来实现跨平台、跨环境的对象创建。 抽象工厂模式的核心思想在于隔离了具体类的生成,使得系统可以在不修改原有代码的情况下更换新的产品系列。这种模式通常应用于以下场景: 1. ...

    抽象工厂模式

    ### 抽象工厂模式解析 #### 一、概念与应用场景 **抽象工厂模式**是一种创建型设计模式,它提供了一种接口,可以创建一系列相关的或相互依赖的对象,而无需指定它们具体的类。此模式适用于系统中的一组产品家族,...

    Java设计模式之抽象工厂模式

    ### Java设计模式之抽象工厂模式解析 #### 一、什么是抽象工厂模式? 抽象工厂模式(Abstract Factory)是一种创建型设计模式,它为创建一组相关或相互依赖的对象提供了一个接口,而无需指定它们的具体类。这种...

    java抽象工厂模式实现热带工厂

    通过这个简单的例子,我们可以看到抽象工厂模式的主要优点在于它能够提供一个高度抽象和一致的接口,用于创建一组相关的对象,而无需指定它们具体的类。这对于需要创建多个相关对象的场景非常有用,特别是当这些对象...

    解析iOS应用开发中对设计模式中的抽象工厂模式的实现

    抽象工厂模式是面向对象设计模式的一种,主要用于对象的创建。在iOS应用开发中,它能够帮助开发者隔离对象的创建过程,使得消费者只需关心产品的使用,而不必关心如何创建这些产品。这种模式尤其适用于存在多个相关...

    设计模式中的抽象工厂

    抽象工厂模式的主要目标是在不指定具体类的情况下,创建一组相关的或相互依赖的对象。这种模式通过定义一个创建一系列相关或相互依赖对象的接口,但让子类决定实例化哪些类。这使得系统可以独立于如何创建、组合这些...

    设计工厂模式的例子,里面包含了两个例子

    本压缩包包含的“设计工厂模式的例子”提供了两个实际应用场景,旨在帮助理解和运用工厂模式。 工厂模式的核心思想是将对象的创建过程封装起来,通过一个共同的接口或抽象类来生产不同类型的实例,而不是让客户端...

    反射简单工厂模式工厂模式

    本文将深入探讨"反射"以及两种常见的工厂模式:"简单工厂模式"和"工厂方法模式",并结合提供的文件名称来解析这些概念。 首先,我们来看"反射"。在Java等面向对象语言中,反射是一种强大的工具,它允许程序在运行时...

    简单工厂模式的例子

    在这个例子中,我们将会深入理解简单工厂模式的概念、工作原理以及如何在实际编程中应用。 简单工厂模式的核心思想是定义一个工厂类,这个类负责创建对象,而客户端通过调用工厂类的特定方法来获取所需的对象。这样...

    工厂模式的测试并有spring ioc的简单实现

    工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式**(simpleFactory):这种模式中,我们通常定义一个工厂类,它根据传入的参数来决定创建哪种具体的产品对象。简单工厂模式适用于产品...

    软件设计模式3.ppt

    **抽象工厂模式**是软件设计模式中的一种,属于对象创建型模式。该模式的主要目的是为了解耦客户端(调用者)与具体产品实现之间的关系,让客户端可以通过抽象工厂来创建所需的产品族,而不必关心具体的产品实现。...

    设计模式之简单工厂模式源码

    简单工厂模式是软件设计模式中的一种基础模式,它在创建对象时起到了抽象和封装的作用,使得客户端无需关心具体对象的创建过程,只需要通过一个公共的工厂接口就能获取所需的对象。这种模式尤其适用于当系统中存在...

    Java设计模式04简单工厂模式.pdf

    此外,工厂类的职责相对单一,如果需要更多的控制和策略,可能需要考虑使用更复杂的工厂模式,如工厂方法模式或抽象工厂模式。 #### 三、模式扩展与注意事项 虽然简单工厂模式在许多场景下表现良好,但在一些情况...

    设计模式工厂方法模式PPT学习教案.pptx

    * Factory:抽象工厂类,定义了创建产品的接口。 * ConcreteFactory:具体工厂类,实现了创建产品的接口。 在工厂方法模式中,客户端程序不会直接创建对象,而是通过工厂类来创建对象。这样可以在不修改已有的代码...

    软件编程模式---工厂模式基础

    - **抽象工厂模式(Abstract Factory)**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 ### 5. 工厂模式的优点 - 客户端无须知道产品类的实现细节,降低了耦合度。 - 新增产品时,无需...

    设计模式习题从简单工厂模式到组合模式

    ### 设计模式习题解析:从简单工厂模式到组合模式 ...以上三个设计模式的例子覆盖了简单工厂模式、工厂方法模式和抽象工厂模式,通过这些例子,我们可以更好地理解这些模式的应用场景和实现方式。

    java使用dom4j解析xml配置文件实现抽象工厂反射示例

    总结起来,这个示例展示了如何在Java中利用DOM4J解析XML配置文件,结合抽象工厂模式和反射机制来创建和管理对象。这样的设计允许开发者在不修改代码的情况下,通过调整配置文件就能改变系统的运行行为,提高了软件的...

    建造者模式学习以及与工厂模式的区别

    1. 创建过程的复杂度:工厂模式通常用于创建简单的对象,而建造者模式则用于创建更复杂的对象,通过一系列步骤来构建。 2. 结构差异:工厂模式只有一个工厂类,而建造者模式包含导演类和多个建造者类。 3. 产品组装...

    javascript工厂模式和构造函数模式创建对象方法解析.docx

    ### JavaScript工厂模式与构造函数模式创建对象方法解析 #### 一、工厂模式 在JavaScript中,工厂模式是一种常用的设计模式,用于封装创建对象的过程。它通过一个函数来创建具有相似特性的多个对象实例,这些对象...

Global site tag (gtag.js) - Google Analytics