抽象工厂模式中的有以下的四种角色:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
抽象工厂(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);
    }
}
小结:抽象工厂模式特别适合于这样的一种产品结构:产品分为几个系列,在每个系列中,产品的布局都是要同的,在一个系列中某个位置的产品,在另一个系列中一定有一个对应的产品。这样的产品结构是存在的,这几个系列中同一位置的产品可能是互斥的,它们是针对不同客户的解决方案,每个客户都只择其一。
优点:消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。
缺点:当具体产品修改时,相应的工厂类也要做相应的修改。
如果觉得写得好,请一定要支持一下,以给我信心和鼓励把剩下的模式例子写出来。
 

转载于:https://blog.51cto.com/tianli/32545

抽象工厂模式解析例子相关推荐

  1. C++设计模式详解之抽象工厂模式解析

    抽象工厂模式概念 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类 抽象工厂模式实例 以组装电脑为例,一般来说,电脑组装都不可能是一家公司的零件,简单的来说,显卡就有NVIDIA和A ...

  2. 抽象工厂模式,工厂方法模式区别

    抽象工厂模式 转载自:https://www.shiyanlou.com/courses/document/867 一.本节目标 我们本节课程主要介绍[抽象工厂模式]的相关知识,将会涉及以下内容: 什 ...

  3. JavaScript 设计模式学习第九篇- 抽象工厂模式

    工厂模式 (Factory Pattern),根据输入的不同返回不同类的实例,一般用来创建同一类对象.工厂方式的主要思想是将对象的创建与对象的实现分离. 抽象工厂 (Abstract Factory) ...

  4. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  5. 结合案例深入解析:抽象工厂模式

    一.基本概念 当涉及到产品族的时候,就需要引入抽象工厂模式了. 每一个模式都是针对一定问题的解决方案.抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则 ...

  6. 《软件架构与设计模式》关于 抽象工厂模式 的一个小例子

    下面是题目的要求: 根据上面的要求,我首先是画出了UML类图: 接着,根据上面的UML类图写出源代码: 1.抽象产品类 该类定义了产品的共性,所有的具体产品都要实现这个类 1 abstract cla ...

  7. 3.2.3 抽象工厂模式(Abstract Factory) -《SSM深入解析与项目实战》

    文章目录 3.2.3 抽象工厂模式(Abstract Factory) 概述 抽象产品接口 具体产品实现 抽象工厂 抽象工厂的实现 抽象工厂模式测试 演示结果 总结 3.2.3 抽象工厂模式(Abst ...

  8. 抽象工厂模式java_Java之抽象工厂模式(Abstract Factory)

    1.设计意图 提供一个接口,用于创建相关或者从属对象的族,而不是指定他们的具体类.以下以生产计算机为例给出UML类图: 2.演示案例 假设我们要生产一台计算机(广义的),一台计算机有一些共同的物件.小 ...

  9. getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...

    文章系列目录(持续更新中): [设计模式]第一篇:概述.耦合.UML.七大原则,详细分析总结(基于Java) [设计模式]第二篇:单例模式的几种实现And反射对其的破坏 一 为什么要用工厂模式 之前讲 ...

最新文章

  1. 重视隐私信息安全,笑迎人脸识别百亿蓝海
  2. 武汉大学计算机学院 毕业答辩,“云答辩”详细流程出炉! 武大本科生毕业答辩这样办...
  3. 三天没有更新我的BLOG
  4. 使用ffmpeg进行h.264编码
  5. 【HDU 5532 Almost Sorted Array】水题,模拟
  6. OpenSSL在Windows下使用vs2010的编译安装
  7. 云计算仿真框架CloudSim介绍
  8. (18)System Verilog禁止约束语句
  9. XDeepFM高阶特征交互,特征交互:一种极深因子分解机模型
  10. linux内核多个补丁,一个令人惊叹的Linux内核补丁
  11. 跨境贸易EDM邮件使用指南
  12. 基于JAVAweb唐院寻人表白系统计算机毕业设计源码+数据库+lw文档+系统+部署
  13. 常用矩阵向量求导公式
  14. Android兼容性测试的一些坑
  15. Swagger3.0快速开发及空指针异常的解决
  16. python程序设计基础之turtle库制作简单的小图片
  17. 《快学Scala》第二章练习题答案+概述
  18. 2022 高教社杯全国大学生数学建模竞赛获奖名单(初稿)
  19. 简单电话簿管理系统(C语言)
  20. 背靠百度,度小满金融越来越稳

热门文章

  1. 使输入框(input   textarea)变为只可读状态readonly=readonly,禁用输入框disabled=disabled...
  2. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 3
  3. gsmake —— golang版gradle
  4. CentOS学习笔记--目录配置
  5. Xml Document与 xml反序列化
  6. SQL 在OPENQUERY中使用参数
  7. echo和print 的区别
  8. asp.net导出数据到Excel
  9. 春节书单:优秀的产品经理们都在读什么?
  10. Chaincode for Operators(运营商的链码手册)