设计模式(十)——抽象工厂模式
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的杰作 * 葡萄和西红柿是 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...
- 设计模式复习-抽象工厂模式
设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...
- 设计模式之四(抽象工厂模式第三回合)
原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...
- python抽象工厂模式_Python设计模式之抽象工厂模式
Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...
- 设计模式-04抽象工厂模式
设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...
- C#设计模式(4)——抽象工厂模式
C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...
- 设计模式之抽象工厂模式(Abstract Factory)摘录
面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...
- java 工厂模式的写法_Java23种设计模式之抽象工厂模式
概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
最新文章
- UVa272 - TEX Quotes(输入输出)
- 一步步编写操作系统 34 内核利用bios中断获取物理内存大小
- GeneDock协助诊断基层地区的听力障碍儿童 #科技有温度#
- php 访问类的属性,PHP OOP如何访问类的父属性范围解析运算符(::)?
- jquery 验证email
- 单按钮启停电路实物图_什么是电路的主回路?什么是控制回路?它们之间有什么区别?...
- 2021年合肥工业大学《高等代数》试题和答案(蔡宇编辑)
- 用户登录功能设计思路
- 课程表里的表表机器人_酷Q机器人课程表查询插件 QianSW.Com系列插件
- html页面实现英中语言选择,js代码实现网站中英文相互翻译
- 截获HTTP/HTTPS请求实现头脑王者辅助
- 智能卡卡发卡流程(收藏1)
- 中小学语文80个常用成语,附故事讲解,孩子写作必备素材!
- 微型计算机的硬件系统主要核心软件,计算机硬件系统最核心的是什么
- thinkphp3.2.3 支付宝授权登录php
- 七日之都账号服务器,永远的7日之都服务器数据互通吗_永远的7日之都iOS和安卓能一起玩吗_玩游戏网...
- win10网线插上显示的ipv6的服务器,win10如何开启IPV6及WIN10无法上ipv6的解决方法
- Python中open函数的各个mode的理解
- python使用cer证书进行https访问接口
- 如何让安卓APP一直在后台运行?