`
newleague
  • 浏览: 1471577 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Java设计模式圣经连载(03)-抽象工厂模式

 
阅读更多
1.3 抽象工厂(Abstract Factory)模式
    抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。
    每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。
    在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。
    产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:
点击在新窗口查看全图

 
    理解这个产品结构是理解抽象工厂模式的关键所在,所以我不惜花费时间来画此图。如果领悟不到此图的含义,就无法区分工厂方法模式和抽象工厂模式的区别。
    从上图可以看出,抽象工厂模式的每个工厂创造出来的都是一族产品,而不是一个或者一组。组是可以随意组合的!其实两个就这点点差别,呵呵,估计现在你已经差不多明白了抽象工厂模式的含义。不废话了,看个例子,真相将大白于天下!
 
1.3.1 抽象工厂模式在农场中的实现

1.3.1.1 背景

    聪明的农场主总是让自己的庄园越来越有价值,“农场”在经历了简单工厂模式和工厂模式后,不断的扩大生产。如今,再次面临新的大发展,一项重要的工作就是引进塑料大棚技术,在大棚里种植热带(Tropical)和亚热带(Northern)的水果和蔬菜,用以满足市场需求,获取更大的利益。

1.3.1.2 产品角色图

    经过分析,对产品角色进行分析得出下图
点击在新窗口查看全图

 
1.3.1.3 系统设计

    经过分析,所谓的各个园丁其实就是工厂角色,而蔬菜和水果则是产品角色。将抽象工厂模式用于农场中,系统设计图如下:
 
点击在新窗口查看全图

 
1.3.1.4 实现源码

1.3.1.4.1 抽象工厂:Gardener.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:Gardener.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    22:55:23
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  抽象工厂角色:工厂接口
 */
public interface Gardener {
    public Fruit createFruit(String name);
    public Veggie createVeggie(String name);
}
 
1.3.1.4.2 抽象水果产品:Fruit.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:Fruit.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    22:54:15
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  抽象产品角色:水果接口
 */
public interface Fruit {
}
 
1.3.1.4.3 抽象蔬菜产品:Veggie.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:Veggie.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    22:56:22
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  抽象产品角色:蔬菜接口
 */
public interface Veggie {
}
 
1.3.1.4.4 热带水果:TropicalFruit.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:TropicalFruit.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    22:57:08
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  具体产品角色:热带水果
 */
public class TropicalFruit implements Fruit {
    private String name;
    public TropicalFruit(String name) {
        System.out.println("热带工厂为您创建了:热带水果-"+name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
 
1.3.1.4.5 热带蔬菜:TropicalVeggie.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:TropicalVeggie.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    22:58:03
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  具体产品角色:热带蔬菜
 */
public class TropicalVeggie implements Veggie {
    private String name;
    public TropicalVeggie(String name) {
        System.out.println("热带工厂为您创建了:热带水果-"+name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
 
1.3.1.4.6 亚热带水果:NorthernFruit.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:NorthernFruit.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    22:58:55
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  具体产品角色:亚热带水果
 */
public class NorthernFruit implements Fruit {
    private String name;
    public NorthernFruit(String name) {
        System.out.println("亚热带工厂为您创建了:亚热带水果-"+name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

1.3.1.4.7 亚热带蔬菜:NorthernVeggie.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:NorthernVeggie.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    22:59:36
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  具体产品角色:亚热带蔬菜
 */
public class NorthernVeggie implements Veggie {
    private String name;
    public NorthernVeggie(String name) {
        System.out.println("亚热带工厂为您创建了:亚热带蔬菜-"+name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
 
1.3.1.4.8 热带工厂:TropicalGardener.java
/**
 * Created by IntelliJ IDEA.
 * FileName:TropicalGardener.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    23:01:49
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  具体工厂角色:热带工厂
 */
public class TropicalGardener implements Gardener {
    public Fruit createFruit(String name) {
        return new TropicalFruit(name);
    }
    public Veggie createVeggie(String name) {
        return new TropicalVeggie(name);
    }
}
 
1.3.1.4.9 亚热带工厂:NorthernGardener.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:NorthernGardener.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    23:00:31
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  具体工厂角色:亚热带工厂
 */
public class NorthernGardener implements Gardener {
    public Fruit createFruit(String name) {
        return new NorthernFruit(name);
    }
    public Veggie createVeggie(String name) {
        return new NorthernVeggie(name);
    }
}

 
1.3.1.4.10 测试类(客户端):TestApp.java
package com.lavasoft.patterns.abstractfactory.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:TestApp.java
 * User:    LavaSoft
 * Date:    2006-12-5
 * Time:    23:03:22
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--抽象工厂模式--一般性模式(农场应用)
 * ReadMe:  测试类(客户端)
 */
public class TestApp {
    private void test(){
        Veggie tv,nv;
        Fruit tf,nf;
        TropicalGardener tg=new TropicalGardener();
        NorthernGardener ng=new NorthernGardener();
        tv=tg.createVeggie("热带菜叶");
        nv=ng.createVeggie("东北甜菜");
        tf=tg.createFruit("海南椰子");
        nf=ng.createFruit("雪梨");
    }
    public static void main(String args[]){
        TestApp test=new TestApp();
        test.test();
    }
}
 
1.3.1.4.11 测试运行结果
    热带工厂为您创建了:热带水果-热带菜叶
    亚热带工厂为您创建了:亚热带蔬菜-东北甜菜
    热带工厂为您创建了:热带水果-海南椰子
    亚热带工厂为您创建了:亚热带水果-雪梨
    Process finished with exit code 0
    看完设计图和源码,原理已经很清楚了,这个模式应用很灵活,猴交给你了,看你怎么玩它!哈哈哈哈。。。。
1.3.1.5 女娲举绳造万物
    女娲举绳造物的故事很适合在这里举例子,女娲的绳子按照阴阳划分,产品则按人、兽划分。将抽象工厂模式用于女娲造万物的模拟系统设计中。系统设计图如下:
点击在新窗口查看全图

 
    看完这个设计图,参考农场的例子,实现已经很容易了,就不赘述了。
分享到:
评论

相关推荐

    Java设计模式圣经连载

    Java 设计模式圣经 喜欢的可以下载 看看

    Java设计模式圣经连载工厂.doc

    抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。

    Java 设计模式与原理

    这本是最详细的Java设计模式类的书籍,被称为Java的圣经。 书中详细介绍了Java的23种设计模式,并且含有源代码,便于读者上机体验

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    然而学习设计模式的过程却是痛苦的,从阅读设计模式的圣经——GoF的《设计模式:可复用面向对象软件的基础》时的枯燥、苦闷、茫无头绪,到有一天突然有一种顿悟;自己去实现GoF的23中模式时候的知其然不知其所以然,...

    设计模式精解- GoF 23种设计模式解析附C++实现源码

    设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和...想想当时读GoF的那本圣经时候的苦闷、实现23个模式时候的探索、悟道后的欣悦,我觉得还是有这懂了设计模式,个意义。 侵删

    网上选课系统毕业论文

    设计模式 下载 -------- 注册表及系统安全 下载 介绍: 注册表及系统安全 内容包括:注册表修改快速入门、win98注册表、DOS下维护注册表的高级技巧、winXP、2000安全设置、2003等。 -----------

    Thinking in java4(中文高清版)-java的'圣经'

    研讨课 Hands-on Java研讨课CD Thinking in Objects研讨课 Thinking in Enterprise Java Thinking in Patterns(with Java) Thinking in Patterns研讨课 设计咨询与复审 附录B 资源 软件 编辑器与IDE 书籍 分析与设计...

    设计模式精解-GoF23种设计模式解析附C++实现

    设计模式精解-GoF23种设计模式解析附C++实现,给出了设计模式"圣经"-GOF列出的全部23种设计模式的C++实现,清晰,易懂。

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在项目中的应用经历拿出来和大家共享,却总是下不了这个...

    go语言圣经-----

    go语言代码大全您上传的资源如果因版权、使用、内容完整度 等原因被举报并通过官方审核,将扣除通过该资源获得的全部积分

    设计模式讲稿-2007.pdf 中文版 侯捷 侯俊杰

    设计模式讲稿-2007.pdf 中文版 侯捷 侯俊杰 c++八大金刚: 1、Essentital c++---lippman---C++之父,旁枝暂略,主攻核心,轻薄短小,初学者 2、The c++ programming language----C++之父,技术权威,用词深峻,思想...

    c语言圣经-----全面深入理解C语言

    全面深入理解C语言 C is a general-purpose programming language. It has been closely associated with the UNIX operating system where it was developed, since both the system and most of the programs that...

    java(圣经)

    java圣经,学习java的人都因该好好看这本书。

    求职圣经---成为企业最受欢迎的人

    读了半辈子书就为了找个好工作。求职者必备宝典,强烈建议大家下载阅读。

    从原型批评角度看白鲸中的圣经文化原型-论文.zip

    从原型批评角度看白鲸中的圣经文化原型-论文.zip

    开发圣经:设计模式-可复用面向对象软件的基础完整版

    设计模式开山之作,广大技术人员的圣经和经典,Amazon和各大书店销售榜前列,十五年来不断重印,销售逾七万册。 每次立新项目前翻一遍,绝对能给自己的头脑加上光环!程序员必备。

    java代码重构圣经

    java代码重构以前忽视了,最近在看 字字珠玑,相见恨晚

    设计模式实训教程代码

    如果说“四人帮”的《设计模式》是设计模式领域的“圣经”,那么之后出版的各种关于设计模式的书都可称之为“圣经”的“注释版”或“圣经的故事”。本书是得道者对“圣经”的“禅悟”,它既不像“圣经”那样因为惜字...

    Head First设计模式-超高清

    的人都要读四人组的《设计模式》, 这就是00的圣经。 更有趣的 是 有人还不只买这本书的原版书、 连宅的光企版 、 和中译本也一并买了收藏 , 可见这是一本多么受到敌视的书。 我打掠过这本书的销售量 , t畅销的...

    软件研发圣经-JAVA篇

    软件研发圣经-JAVA篇,一个大师级的人物告诉你如果学好JAVA

Global site tag (gtag.js) - Google Analytics