1.描述

提供一个一系列或相互依赖对象的接口,而无需指定他们具体的类。

2.模式的使用

·抽象产品(Product):一个抽象类或接口,负责定义具体产品必须实现的方法。

·具体产品(ConcreteProduct):具体产品是一个类,实现或继承抽象产品。

·抽象工厂(AbstractFactory):一个抽象类或接口,定义若干抽象方法。

·具体工厂(ConcreteFactory):实现或继承抽象工厂,返回具体产品的实例。

3.使用情景

·系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化对象,即希望用户和创建对象的类脱藕。

·系统需要为用户提供多个对象,以便用户联合使用他们,但又不希望用户决定如何关联他们。

·系统需要为用户提供一系列对象,但只需要用户知道这些对象有哪些方法可用,不需要用户知道这些对象的创建过程。

4.优点

·使用户和创建对象的类脱藕。

·可以方便的为用户提供一些列对象。用户使用不同的具体工厂就可以得到一组相关的对象,同时也避免用户混淆不同系列的对象。

·可以随时增加“具体工厂”为用户提供一组相关的对象。

5.UML图

6.案例

在前面的中介者模式的案例,将买方和卖方用工厂模式生产出来。

  1 package 工厂模式;
  2
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.Iterator;
  6 import java.util.Set;
  7
  8 public class test1 {
  9
 10     public static void main(String[] args) {
 11         ConcreteMediator mediator  = new ConcreteMediator();
 12         Factory f = new Factory(mediator);
 13         ArrayList<Colleague> l1 = f.createBuyers(2);
 14         for(int i = 0; i <= 1; i++)
 15             ((Buyer1)l1.get(i)).setName("买家" + i);
 16         ArrayList<Colleague> l2 = f.createSellers(2);
 17         for(int i = 0; i <= 1; i++)
 18             ((Seller1)l2.get(i)).setName("卖家" + i);
 19         l1.get(0).sendMess("我要买汽车");
 20         System.out.println(l1.get(0).getName());
 21     }
 22
 23 }
 24
 25 /*
 26  * 同事
 27  */
 28 interface Colleague{
 29     public void sendMess(String mess); //发布信息
 30     public void receiveMess(Colleague colleague, String mess);  //接受信息
 31     public void setName(String mess);
 32     public String getName();
 33 }
 34
 35 /*
 36  * 买家抽象类
 37  */
 38 abstract class Buyer implements Colleague{
 39     private final static String IDENTITY= "我是买家";
 40     public String getIdentity(){
 41         return IDENTITY;
 42     }
 43 }
 44
 45 /*
 46  * 卖家抽象类
 47  */
 48 abstract class Seller implements Colleague{
 49     private final static String IDENTITY= "我是卖家";
 50     public String getIdentity(){
 51         return IDENTITY;
 52     }
 53 }
 54 /*
 55  * 中介者
 56  */
 57 interface Mediator{
 58     public void registColleague(Colleague colleague);
 59     public void deliverMess(Colleague colleague, String mess);
 60 }
 61
 62 /*
 63  * 具体中介者
 64  */
 65 class ConcreteMediator implements Mediator{
 66     /*
 67      * 在这里采用HashMap容器。因为买卖双方需要进行一对一的信息交互才能达成一致,肯定要对数
 68      * 据进行查询,这种结构查询很快。但在本案例中,只实现了一对多的广播信息功能,实
 69      * 际上没用到HashMap的查询优势。如果只进行遍历,可以换成List结构。
 70      */
 71     private HashMap<Integer, Buyer> buyerMap; //储存买家对象
 72     private HashMap<Integer, Seller> sellerMap;  //储存卖家对象
 73     ConcreteMediator(){
 74         this.buyerMap = new HashMap<Integer, Buyer>();
 75         this.sellerMap = new HashMap<Integer, Seller>();
 76     }
 77     public void registColleague(Colleague colleague) {
 78         //先判断是哪一类,再储存买家、卖家的引用
 79         if(colleague.getClass().getGenericSuperclass().toString().equals("class 工厂模式.Buyer"))
 80             this.buyerMap.put(colleague.hashCode(), (Buyer) colleague);
 81         if(colleague.getClass().getGenericSuperclass().toString().equals("class 工厂模式.Seller"))
 82             this.sellerMap.put(colleague.hashCode(), (Seller) colleague);
 83     }
 84
 85     public void deliverMess(Colleague colleague, String mess) {
 86         //买家将消息发送给所有卖家
 87         if(colleague.getClass().getGenericSuperclass().toString().equals("class 工厂模式.Buyer")){
 88             //遍历HashMap的方法
 89             Set<Integer> set = this.sellerMap.keySet();
 90             Iterator<Integer> iterator = set.iterator();
 91             Integer i;
 92             while(iterator.hasNext()){
 93                 i = iterator.next();
 94                 this.sellerMap.get(i).receiveMess(this.sellerMap.get(i),mess);
 95             }
 96         }
 97         //卖家将所有消息发送给买家
 98         if(colleague.getClass().getGenericSuperclass().toString().equals("class 工厂模式.Seller")){
 99             //遍历HashMap的方法
100             Set<Integer> set = this.buyerMap.keySet();
101             Iterator<Integer> iterator = set.iterator();
102             Integer i;
103             while(iterator.hasNext()){
104                 i = iterator.next();
105                 this.buyerMap.get(i).receiveMess(this.buyerMap.get(i), mess);
106             }
107         }
108     }
109
110 }
111
112 /*
113  * 具体同事
114  */
115 class Buyer1 extends Buyer{
116     private String name;
117     Mediator mediator; //存储中介者的引用,也许还有其他中介者用来实现其他的信息交互。
118     Buyer1(Mediator mediator){
119         this.mediator  = mediator;
120         mediator.registColleague(this);
121     }
122     public void sendMess(String mess) {
123         mediator.deliverMess(this, mess);
124     }
125
126     public void receiveMess(Colleague colleague, String mess) {
127         System.out.println("卖家发出消息   " + colleague.getName() + "接受信息:" + mess);
128     }
129
130     public void setName(String name) {
131         this.name  = name;
132     }
133
134     public String getName() {
135         return name;
136     }
137 }
138
139 /*
140  * 具体同事
141  */
142 class Seller1 extends Seller{
143     private String name;
144     Mediator mediator;
145     Seller1(Mediator mediator){
146         this.mediator  = mediator;
147         mediator.registColleague(this);
148     }
149     public void sendMess(String mess) {
150         mediator.deliverMess(this, mess);
151     }
152
153     public void receiveMess(Colleague colleague, String mess) {
154         System.out.println("买家发出消息   " + colleague.getName() + "接受信息:" + mess);
155     }
156
157     public void setName(String name) {
158         this.name  = name;
159     }
160
161     public String getName() {
162         return name;
163     }
164 }
165
166 /*
167  * 工厂接口
168  */
169 interface abstractFactory{
170     public Colleague createBuyer();
171     public Colleague createSeller();
172     public ArrayList<Colleague> createBuyers(int n);
173     public ArrayList<Colleague> createSellers(int n);
174 }
175
176 /*
177  * 具体工厂
178  */
179 class Factory implements abstractFactory{
180     private Mediator mediator;
181     public Factory(Mediator mediator){
182         this.mediator = mediator;
183     }
184     public Colleague createBuyer() {
185         return new Buyer1(mediator);
186     }
187
188     public Colleague createSeller() {
189         return new Seller1(mediator);
190     }
191
192     public ArrayList<Colleague> createBuyers(int n) {
193         ArrayList<Colleague> list = new ArrayList<Colleague>();
194         for(int i = 0; i < n; i++)
195             list.add(new Buyer1(mediator));
196         return list;
197     }
198
199     public ArrayList<Colleague> createSellers(int n) {
200         ArrayList<Colleague> list = new ArrayList<Colleague>();
201         for(int i = 0; i < n; i++)
202             list.add(new Seller1(mediator));
203         return list;
204     }
205
206 }

转载于:https://www.cnblogs.com/cxy2016/p/7670087.html

设计模式(十)——抽象工厂模式相关推荐

  1. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  2. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  3. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  4. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  5. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  6. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  7. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

  8. C#设计模式(4)——抽象工厂模式

    C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...

  9. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  10. java 工厂模式的写法_Java23种设计模式之抽象工厂模式

    概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

最新文章

  1. UVa272 - TEX Quotes(输入输出)
  2. 一步步编写操作系统 34 内核利用bios中断获取物理内存大小
  3. GeneDock协助诊断基层地区的听力障碍儿童 #科技有温度#
  4. php 访问类的属性,PHP OOP如何访问类的父属性范围解析运算符(::)?
  5. jquery 验证email
  6. 单按钮启停电路实物图_什么是电路的主回路?什么是控制回路?它们之间有什么区别?...
  7. 2021年合肥工业大学《高等代数》试题和答案(蔡宇编辑)
  8. 用户登录功能设计思路
  9. 课程表里的表表机器人_酷Q机器人课程表查询插件 QianSW.Com系列插件
  10. html页面实现英中语言选择,js代码实现网站中英文相互翻译
  11. 截获HTTP/HTTPS请求实现头脑王者辅助
  12. 智能卡卡发卡流程(收藏1)
  13. 中小学语文80个常用成语,附故事讲解,孩子写作必备素材!
  14. 微型计算机的硬件系统主要核心软件,计算机硬件系统最核心的是什么
  15. thinkphp3.2.3 支付宝授权登录php
  16. 七日之都账号服务器,永远的7日之都服务器数据互通吗_永远的7日之都iOS和安卓能一起玩吗_玩游戏网...
  17. win10网线插上显示的ipv6的服务器,win10如何开启IPV6及WIN10无法上ipv6的解决方法
  18. Python中open函数的各个mode的理解
  19. python使用cer证书进行https访问接口
  20. 如何让安卓APP一直在后台运行?

热门文章

  1. mysql 查询优化 ~ explain与索引失效
  2. Python3学习笔记(六):字符串
  3. react redux学习之路
  4. 《实时控制软件设计》第一周作业
  5. ipcs, ipcrm
  6. 《设计模式系列》---工厂方法
  7. 计算机专业的一个四年工作的总结
  8. SQL Server 2000 索引视图提高性能2
  9. android handle显示加载框
  10. C++常用方法笔记资料