当前位置: 首页 > 编程日记 > 正文

抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV,还生产海尔冰箱,海尔空调等等,如果使用工厂方法模式就需要产生很多个工厂类来实现,而抽象工厂模式只需要一个工厂类即可生产一个品牌的多种产品。所以抽象工厂模式比工厂方法模式更加简单,有效率。

抽象工厂模式

1.抽象工厂模式动机

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

可以看出,如果使用工厂方法模式,就需要创建20个具体工厂类才能生产上图的所有产品,如果使用抽象工厂模式,只需要4个类,分别是三星厂,松下厂,TCL厂和海尔厂。

2.抽象工厂模式定义

抽象工厂模式就是定义一个可以生产对象的接口,让子类决定要生产哪一个类的接口,工厂方法模式让类的实例化程序延迟到子类中实行。

3.抽象工厂模式的结构图

0818b9ca8b590ca3270a3433284dd417.png

参与者说明:

AbstractFactory(抽象工厂)

△抽象工厂中可一个定义各组方法,每组方法对应着一个产品等级结构(一种类型如风扇)。

ConcreteFactoryA和ConcreteFactoryB(具体工厂)

△实现抽象工厂中的生成抽象产品方法,生产一组具体产品,这类产品形成一个产品族(一个品牌,如TCL),每个产品都位于某个产品的等级结构中。

AbstractProductA和AbstractProductB(抽象产品A和抽象产品B)

△为等级结构中的成员声明抽象业务方法。

ConcreteProduct (A1/A2/B1/B2)(具体产品)

△具体产品,具有唯一的产品族和产品等级结构属性。

4.抽象工厂模式主要代码(一个简单的例子)

抽象产品类

(电视)TV.cs

public interface TV

{

public void Play();

}

(风扇)Fan.cs

public interface Fan

{

public void Play();

}

具体产品类

(海尔电视)HaiErTV.cs

public class HaiErTV : TV

{

public void Play()

{

Console.WriteLine("海尔电视");

}

}

(海尔风扇)HaiErFan.cs

public class HaiErFan : Fan

{

public void Play()

{

Console.WriteLine("海尔风扇");

}

}

(TCL电视)TCLTV.cs

public class TCLTV : TV

{

public void Play()

{

Console.WriteLine("TCL电视");

}

}

(TCL风扇)TCLFan.cs

public class TCLFan : Fan

{

public void Play()

{

Console.WriteLine("TCL风扇");

}

}

抽象工厂类

AbsractFactory.cs

public interface AbstractFactory

{

public TV CreateTV();

public Fan CreateFan();

}

具体工厂类

(海尔)HaiErFactory.cs

public class HaiErFactory : AbstractFactory

{

public TV CreateTV()

{

return new HaiErTV();

}

public Fan CreateFan()

{

return HaiErFan();

}

}

(TCL)TCLFactory.cs

public class TCLFactory : AbstractFactory

{

public TV CreateTV()

{

return new TCLTV();

}

public Fan CreateFan()

{

return TCLFan();

}

}

测试

AbstractFactory factory;/*定义抽象工厂*/

TV tv;/*定义抽象电视*/

Fan fan;/*定义抽象风扇*/

factory = new HaiErFactory();

tv = factory.CreateTV();

tv.Play();/*海尔电视*/

fan = factory.CreateFan();

fan.Play();/*海尔风扇*/

5.总结

优点

△隔离了具体类的生成,是的客户端并不需要知道什么被创建。由于这种隔离,更换了一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。实现高内聚低耦合。

△当一个产品族中的多个对象被设计成一起工作的时候,抽象工厂模式能够保证客户端只使用同一个产品族中的对象。

△增加新的具体工厂和产品族很方便,无需要修改已有系统。

缺点

△在添加新产品对象是,难以拓展抽象工厂来生产新种类的产品,这是因为抽象工厂角色中规定了所有可能被创建的产品集合。要支持新种类的产品就意味着要对该接口进行拓展,需要修改代码。

6.参考

《设计模式》主编:刘伟

相关文章:

npm-run 自动化

为什么使用npm run 插件不需要全局安装,只要安装在工程项目中,npm上的包提供了命令行接口,可以直接使用这些局部安装的插件; 举例(babel): 在工程项目中局部安装babel、转码规则后,直接在终端中…

docker 安装 oracle12,使用Docker安装Oracle 12c

使用Docker安装Oracle 12c假设你的服务器已成功安装Docker,继续进行以下操作:1. 启动Docker[rootnode01 ~]# service docker start2. 从远程仓库搜索oracle image[rootnode01 ~]# docker search oracleINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDd…

python3 面向对象(一)

以Student类为例,定义类通过 class 关键字 class Student(object):pass class 后面紧接着是类名,即 Student,类名通常是大写开头的单词,紧接着是 (object),表示该类是从哪个类继承下来的 >>> stu Student() …

shell监控java接口服务_Linux系统下Java通过shell脚本监控重启服务

简介最近运维人员提出需求,增加一个运维页面, 查询当前的业务进程信息包括:进程名称、启动命令、启动时间、运行时间等,可以通过页面点击重启按钮,可以重启后端的一系列系统进程。思路java程序获取linux进程信息可以通…

signature=680da11b802226668317d65ae7c38eb7,encryption with designated verifiers

摘要:The offline keyword guessing attack (KG attack) is a new security threat to the searchable public key encryption with designated verifier. Many techniques have been proposed to resist such an attack. However, all these techniques are only s…

PHPMailer类 发送邮件

/*** [sendMail 邮件发送类]* param [string] $address [收件人的邮件地址]* param [string] $nickname [收件人的昵称]* param [string] $subject [邮件的标题]* param [string] $content [邮件的内容]* param [string] $attachment [邮件的附件]* return …

oracle两张表 比较好,比较Oracle两张表的数据是否一样

比较Oracle两张表的数据是否一样爱搞机 2008-10-21 11:00在某些情况下,我们会需要比较两张表的数据是否一样。假设有两张表A与表B他的字段相同,但是当中的数据可能不同,而且有些字段的数据还有可能为空方法一(手动):把需要比较的两…

java applet 缺陷_Java Applet在最新JRE上的奇怪性能行为(7.55)

我们使用来自签名提供商的一些专有小程序来签署一些XML.当我们使用JRE 6u37 applet运行没有问题 – 运行速度非常快,从不冻结.但是当我们将JRE更新为7u55或更新时,它经常开始挂起.只有浏览器重启帮助.有没有办法解决这个问题可能是由一些参数或其他东西?这是运行代码…

在线考试系统html模板,请问谁有在线考试系统的网页模板?

请问谁有在线考试系统的网页模板?(2017-03-22 22:58:03)标签:杂谈《帝国网站管理系统》英文译为"EmpireCMS",简称"Ecms",它是基于B/S结构,且功能强大而帝国CMS-logo易用的网站管理系统。本系统由帝…

三角形(css3)

1 .userCard .sanjiao {//三角形的制作;2 width: 0;3 height: 0;4 border-left: 10px solid transparent;5 border-right: 10px solid transparent;6 border-bottom: 10px solid rgba(0, 0, 0, .9);7 margin: -23px 0 0 -10px;8 left: …

MySQL数据copy

摘自http://database.51cto.com/art/201011/234776.htm 1. 下面这个语句会拷贝表结构到新表newadmin中。 (不会拷贝表中的数据) CREATE TABLE newadmin LIKE admin 2. 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句…

oracle数据库有哪些文件构成,Oracle数据库架构中包括几层?每层都有什么元素?...

Oracle数据库架构中包括几层?每层都有什么元素?1 PL/SQL代表 A PROCEDURAL LANGUAGE/SQL B PROGRAM LANGUAGE SQL C POWER LANGUAGE SQL D 都不对2 _____引擎执行PL/SQL块A SQL B PL/SQL C ORACLE D 都不对3 一个对象可以呈现多种形式的能力称为A 多态B …

用html怎么 显示直线,html怎么用鼠标画出一条直线,鼠标移动时候要能看到线条...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼window.onload function(){var oC document.getElementById(c1);var oGC oC.getContext(2d);oC.onmousedown function(ev){var ev ev || window.event;oGC.beginPath();oGC.moveTo(ev.clientX-oC.offsetLeft,ev.clientY-oC.of…

bzoj 1962: 模型王子

呵呵呵呵http://wenku.baidu.com/link?urlo0CPVzuBDLJMt0_7Qph1T7TtdFOzu7O-apIpvaWbIYMz8ZWqBneGqI8LGtLdqpuK5fbQ_v-H01zHwPXDsPrioR5xjCDHjqJn_boYO87ikr_ 1 #include <bits/stdc.h>2 #define LL long long3 #define lowbit(x) x&(-x)4 #define inf 0x3f3f3f3f5 …

cygwin编译verilator_Windows 安装 verilator

windows bubun(cygwin)下载verilatortar xvzf verilator*.t*gzcd verilator*./configure报错./configure /cygdrive/e/download/verilator-4.016configuring for Verilator 4.016 2019-06-16checking whether to use hardcoded paths... yeschecking whether to show and stop …

navicat 几个 可用的东西

1.常用的 表格 一启动 就进入的某某连接某某数据库某某表 2. 结构 比对&#xff08;菜单栏 “工具里面”&#xff09; 3.数据对比 同上 4.保持连接 5.全局查询 在工具中查找 ------在数据库或模式中查找 转载于:https://www.cnblogs.com/hnqm/p/9534942.html

linux内核 semaphore,2.4内核里semaphore源码的一个疑问

博主你好, 请教一个问题.__down()里面有一段代码, 我觉得不那么保险.我先把__down的源码贴出来:void __down(struct semaphore * sem){struct task_struct *tsk current;DECLARE_WAITQUEUE(wait, tsk); //定义一个"队列项", 等待者是当前进…

Android UI体验之全屏沉浸式透明状态栏效果

前言&#xff1a; Android 4.4之后谷歌提供了沉浸式全屏体验&#xff0c; 在沉浸式全屏模式下&#xff0c; 状态栏、 虚拟按键动态隐藏&#xff0c; 应用可以使用完整的屏幕空间&#xff0c; 按照 Google 的说法&#xff0c; 给用户一种 身临其境 的体验。而Android 5.0之后谷歌…

html 多项选择,选项标签中的HTML多字段选择

这可以通过switch语句实现&#xff0c;但这不是最好的方法。我建议将以下函数作为change事件的事件处理程序。您还需要在窗口加载时运行它&#xff0c;以初始化它。function updateSel() {var sel document.getElementById(sel);var hidden sel.getElementsByClassName(hidde…

tp5.0 queue 队列操作

检查是否安装redis(没有请自行百度安装)&#xff1a; phpinfo&#xff1a; 配置thinkphp-queue&#xff0c;没有请执行 composer require topthink/think-queue 加入&#xff1a; 创建 队列 文件&#xff1a; use think\Queue;class TestQueue {// 测试public function queue()…

java redis管理_优雅时间管理Java轻松做到,想学么?

原标题&#xff1a;优雅时间管理Java轻松做到&#xff0c;想学么&#xff1f;来源 |http://rrd.me/gCQHp前言&#xff1a;需求是这样的&#xff0c;在与第三方对接过程中&#xff0c;对方提供了token进行时效性验证&#xff0c;过一段时间token就会失效.后台有定时任务在获取&a…

jenkins运行日志时间与linux,Jenkins 用户文档(运行多个步骤)

运行多个步骤管道由多个步骤组成&#xff0c;允许你构建、测试和部署应用程序&#xff0c;Jenkins管道允许你以简单的方式组成多个步骤&#xff0c;可以帮助你为任何类型的自动化过程建模。将“步骤”想象成执行单个操作的单个命令&#xff0c;当一个步骤成功时&#xff0c;它将…

HPU组队赛B:问题(二进制枚举)

时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题&#xff0c;你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集。比赛的问题集必须包含至少两个问题&#xff0c;而且比赛的总难度必须至少为l至多为r,此外最简单的问题和最难的问题之间的差异至少…

html脱机不显示图片,Python绘图脱机图表嵌入HTML(不工作)

aPlot是绘图文件的文件名。在在您的iframe中&#xff0c;您将.embed?width800&height550添加到文件名中&#xff0c;这将导致一个不存在的文件名。在当您删除这个字符串时&#xff0c;即src" aPlot "&#xff0c;它应该可以工作。在不必嵌入整个HTML文件&…

数据库分库分表(sharding)系列

数据库分库分表(sharding)系列转载于:https://www.cnblogs.com/gotodsp/p/6517478.html

php imagecopy 用法,php使用imagecopymerge()函数创建半透明水印

使用imagecopymerge() 函数创建半透明水印&#xff0c;供大家参考&#xff0c;具体内容如下// 加载要加水印的图像$im imagecreatefromjpeg(photo.jpeg);// 首先我们从 GD 手动创建水印图像$stamp imagecreatetruecolor(100, 70);imagefilledrectangle($stamp, 0, 0, 99, 69,…

linux系统yum源,Linux开启安装EPEL YUM源

我们用yum安装软件时,经常发现我们的yum源里面没有该软件&#xff0c;需要自己去wget&#xff0c;然后configure,make,make install&#xff0c;太折腾了。其实&#xff0c;CentOS还有一个源叫做 EPEL (Extra Packages for Enterprise)&#xff0c;里面有1万多个软件&#xff0…

MATLAB简易验证码识别程序介绍

本推文主要识别的验证码是这种:第一步: 二值化所谓二值化就是把不需要的信息通通去除&#xff0c;比如背景&#xff0c;干扰线&#xff0c;干扰像素等等&#xff0c;只剩下需要识别的文字&#xff0c;让图片变成2进制点阵。第二步: 文字分割为了能识别出字符&#xff0c;需要对…

mac终端命令-----常规操作

OSX 的文件系统 OSX 采用的Unix文件系统&#xff0c;所有文件都挂在跟目录 / 下面&#xff0c;所以不在要有Windows 下的盘符概念。 你在桌面上看到的硬盘都挂在 /Volumes 下。 比如接上个叫做 USBHD的移动硬盘&#xff0c;桌面上会显示出一个硬盘图标&#xff0c;它实际在哪里…

php true true true,php-为什么此评估为true

标签&#xff1a;php乳清这算是真的吗&#xff1f;$val20;//outputs that is an error123if($val2error123){echo that is an error123;}else{echo that is not an error123;}解决方法:您正在将字符串与整数进行比较.为了进行比较,首先将字符串转换为整数.当“ error123”转换为…