笔记:设计模式(3)-Abstract Factory抽象工厂模式

 

工厂模式的起源

1.变化点在“对象的创建”,因此就封装“对象创建”;

2.面向接口编程,依赖接口,而非依赖实现。

 

动机(Motivation)

在系统中,经常面临着“一系列相互以来的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。

 

结构(Structure)

实现(Actionscript code)

//抽象工厂(AbstractFactory)
package com.rock506.themes.abstract
{import flash.errors.IllegalOperationError;public class AbstractThemeFactory{public function createSubmitButton():SubmitButton{throw new IllegalOperationError("abstract method");return null;}public function createCancelButton():CancelButton{throw new IllegalOperationError("abstract method");return null;}public function createMessageBox():MessageBox{throw new IllegalOperationError("abstract method");return null;}}
}
//抽象产品A(AbstractProductA)
package com.rock506.themes.abstract
{import flash.display.Sprite;import flash.errors.IllegalOperationError;public class Panel extends Sprite{public function Panel(){drawSkin();}protected function drawSkin():void{throw new IllegalOperationError("abstract method");}}
}
//抽象产品B(AbstractProductB)
package com.rock506.themes.abstract 
{import flash.display.Sprite;import flash.errors.IllegalOperationError;public class SubmitButton extends Sprite{public function SubmitButton() {drawSkin();}protected function drawSkin():void{throw new IllegalOperationError("abstract method");}}
}
//具体产品A1(ConcreteProductA1)
package com.rock506.themes.win7
{import com.rock506.themes.abstract.Panel;internal class Win7Panel extends Panel{public function Win7Panel(){super();}protected override function drawSkin():void{trace("draw skin: Win7Panel");}}
}
//具体产品B1(ConcreteProductB1)
package com.rock506.themes.win7
{import com.rock506.themes.abstract.SubmitButton;internal class Win7SubmitButton extends SubmitButton{public function Win7SubmitButton(){super();}protected override function drawSkin():void{trace("draw skin: Win7SubmitButton");}}
}
//具体工厂(ConcreteFactory)
package com.rock506.themes.win7 
{import com.rock506.themes.abstract.*;public class Win7ThemeFactory extends AbstractThemeFactory{public override function createSubmitButton():SubmitButton{return new Win7SubmitButton();}public override function createCancelButton():CancelButton{return new Win7CancelButton();}public override function createMessageBox():MessageBox{return new Win7MessageBox();}}
}
//管理器
package com.rock506
{import com.rock506.themes.abstract.AbstractThemeFactory;import com.rock506.themes.abstract.CancelButton;import com.rock506.themes.abstract.Panel;import com.rock506.themes.abstract.SubmitButton;import flash.display.Sprite;public class ThemeManager{private var _theme:AbstractThemeFactory;public function ThemeManager(theme:AbstractThemeFactory){_theme = theme;}public function BuildMessageBox():Sprite{var sp:Sprite = new Sprite();var panel:Panel = _theme.createMessageBox();var submitButton:SubmitButton = _theme.createSubmitButton();var cancelButton:CancelButton = _theme.createCancelButton();sp.addChild(panel);sp.addChild(submitButton);sp.addChild(cancelButton);return sp;}}
}
//客户端
//使用xp主题
//var theme:ThemeManager = new ThemeManager(new XpThemeFactory());
//使用win7主题
var theme:ThemeManager = new ThemeManager(new Win7ThemeFactory());
var messageBox:Sprite = theme.BuildMessageBox();
addChild(messageBox);

 

实现要点(notice)

1.如果没有应对“多系列对象创建”的需求变化,则没有必要使用抽象工厂模式,这时候使用简单的静态工厂完全可以;

2. 系列对象指的是这些对象之间有相互依赖、或作用的关系;

3.抽象工厂模式经常和工厂方法模式共同组合来应对“对象创建”的需求变化;

4.把工厂作为单件,一个应用中一般每个产品系列只需一个具体工厂的实例,因此,工厂通常最好实现为一个单件模式。

  

参考文献(reference)

《C#面向对象设计模式纵横谈》视频

http://terrylee.cnblogs.com

 

 

转载于:https://www.cnblogs.com/rock506/archive/2010/09/21/1825792.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB操作:insert()

2019独角兽企业重金招聘Python工程师标准>>> Override public boolean inSert(String dbName, String collectionName, String[] keys,Object[] values) { DB db null; DBCollection dbCollection null; WriteResult result null; String resul…

最近处理的几个小问题_20160311

最近处理的小问题很多,我就拿出来几个,简单和大家说一说。我就分为三个方面,硬件问题,Oracle表空间迁移,MySQL断电恢复首先是硬件问题。如果看到下面的系统日志,就会发现早在2014年就出现了一些警告和问题&…

3. 什么是icmp?icmp与ip的关系_你知道如何跟女生,确定恋人关系吗?

哈喽!同学你好!我是子伯,是一名情感咨询。今天我想给你分享,和女生再暧昧期,如何去确定关系,因为......在我做咨询当中,有很多男生跟女生,不管是在聊天上,还是在线下的交…

量子计算机完整的图片,记者带你走近世界首台超越早期经典计算机的光量子计算机(组图)...

在光学体系方面,研究团队在去年首次实现十光子纠缠操纵的基础上,利用高品质量子点单光子源构建了世界首台超越早期经典计算机的单光子量子计算机。图为基于单光子的量子计算原型机结构。潘建伟教授供图据了解,多粒子纠缠的操纵作为量子计算的…

漂浮的表单

代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Typ…

计算机word文档无法工作,电脑docx打不开怎么办(word文档无法打开的解决方法)...

我们在日常工作的时候&#xff0c;经常都会遇到这样子的一个问题&#xff0c;那也就是Word文件无法的现象。当我们的工作时间又非常的紧迫&#xff0c;那么个时候该怎么办呢&#xff1f;稳住&#xff0c;别慌&#xff0c;今天小编就来和大家一起探讨一下Word无法打开的解决方法…

LinkedList剖析

第1部分 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and per…

powerdesigner怎么导出pdf_各种科研绘图软件中的矢量图导出技巧

引言科技论文常含有插图&#xff0c;借助插图来形象直观、简明扼要地表达所要表述的内容(梁福军. 科技论文规范写作与编辑[M]. 清华大学出版社, 2014.)。科研绘图软件有很多种&#xff0c;而软件导出的图片可以分为矢量图&#xff08;vector&#xff09;和位图&#xff08;bitm…

Typesafe公司正式更名为Lightbend公司

Scala编程语言的发明者&#xff1a;Typesafe公司&#xff0c;已经完成他们的更名计划&#xff0c;改名后成为Lightbend公司。Typesafe公司在去年五月就宣布了他们的更名计划&#xff0c;从那时起&#xff0c;他们希望可以在两个月内完成改名相关事宜。Typesafe公司邀请了社区的…

理解Javascript_12_执行模型浅析

大家有没有想过&#xff0c;一段javascript脚本从载入浏览器到显示执行都经过了哪些流程&#xff0c;其执行次序又是如何。本篇博文将引出javascript执行模型的概念&#xff0c;并带领大家理解javascript在执行时的处理机制。 简单的开始 简单的代码&#xff1a; <script ty…

怎么制作铁闸门_“短笛”拿铁,最近的心头好!

其实花式咖啡除了市面上一些常见的款式外&#xff0c;还有一些是不常见又好喝的&#xff01;今天来给大家推荐一款“短笛”拿铁&#xff0c;最近的最爱&#xff01;什么是短笛拿铁&#xff1f;piccolo latte&#xff0c;在意大利文中“piccolo”是小的意思&#xff0c;而latte则…

SQL Server 2016 RC0 安装(超多图)

微软最新版本的数据库SQL Server 2016在2016年3月9日推出了RC0版本。已经提供了包括简体中文等多种语言版本&#xff0c;不过联机丛书还是英文版的。对OS的要求是WIN8&#xff0c;WIN10&#xff0c; WIN2012&#xff0c;只有64位版本。让我们下载最新的版本安装测试下。Figure-…

vfp赋值超过7位出错_JDK1.7下的HashMap的源码分析

源码分析jdk1.7下的HashMap我们都知道1.7版本的hashmap的底层是数组加链表构成的&#xff0c;那么今天我们就来自己分析一波源码~篇幅有点长&#xff0c;废话不多说&#xff0c;直接开始分析~「属性声明」//初始化容量 static final int DEFAULT_INITIAL_CAPACITY 1 <4;…

笔记本打开计算机盘非常慢,笔记本开机慢怎么办【方法步骤】

许多人多余学术研究或是体育项目之类是十分精通&#xff0c;白手起家&#xff0c;闯出一片事业的也不在少数&#xff0c;但是在面对 高科 技产品时确实碰到了一鼻子灰&#xff0c;确实&#xff0c;各位读者朋友们所精通专业不同&#xff0c;在加上原本科技产品就是一大难题&…

Vi Notes

2019独角兽企业重金招聘Python工程师标准>>> 进入vi的命令 vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename &#xff1a;打开文件&#xff0c;并将光标置于第n行首 vi filename &#xff1a;打开文件&#xff0c;并将光标置于最后一行…

究极日月服务器维护时间,超激斗梦境9月25日终极测试服务器维护公告_超激斗梦境9月25日更新了什么_玩游戏网...

2021LPL夏季赛FPX vs V5第三场比赛视频2021LPL夏季赛8月4日FPXvsV5视频在哪看&#xff0c;比赛中FPXvsV5比赛中MVP又是谁&#xff0c;2021LPL夏季赛8月4日的比赛中FPXvsV5谁会获胜呢下面一起和小编来看看吧。【2021LPL夏季赛赛程】【2021LPL夏季赛直播】比赛时间&#xff1a;8月…

页面中用到iframe不能完全显示的解决方案

页面中用到iframe不能完全显示的解决方案 如果在页面中用到了iframe标签&#xff0c;有时在浏览器中并不能完全显示iframe&#xff0c;导致有些iframe内的内容不能被显示&#xff0c;如果遇到这种情况&#xff0c;使用以下js可以解决大多数问题。 这是iframe标签&#xff1a; &…

关灯看视频(Turn Off the Lights)

插件介绍随着使用互联网的人越来越多在网络上看视频已是常事一些相关的软件就运应而生今天为大家推荐一个能够提高用户们看视频体验的插件。关灯看视频Turn Off the Lights观看视频时自动调暗页面让您仿佛置身于电影院中只要轻轻按下灯的开关页面就会暗淡下去。 然后您就可以专…

seo 伪原创_如何判断外包的seo文章是否是抄袭或伪原创?

做为资深的外贸seo运营人员&#xff0c;应该会有将内容外包的情况。有时候就会遇到外包的人有抄袭、复制、伪原创的情况发生。那如何避免这种情况的出现呢&#xff1f;相信很多人都遇到过这种情况&#xff0c;是比较头疼的。那就需要检查。抄袭、伪原创这种是必须检查的&#x…

Interview and paper based test

笔试面试总结 榜样&#xff1a; http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html ArrayList和Vector的区别&#xff1f; http://blog.csdn.net/luxiaoxun/article/details/7980618 1. 输出集合的排列、组合 http://blog.csdn.net/u010570643/article/details/…