软件设计模式之创建型模式

上传人:san****019 文档编号:21257046 上传时间:2021-04-27 格式:PPT 页数:30 大小:3.55MB
收藏 版权申诉 举报 下载
软件设计模式之创建型模式_第1页
第1页 / 共30页
软件设计模式之创建型模式_第2页
第2页 / 共30页
软件设计模式之创建型模式_第3页
第3页 / 共30页
资源描述:

《软件设计模式之创建型模式》由会员分享,可在线阅读,更多相关《软件设计模式之创建型模式(30页珍藏版)》请在装配图网上搜索。

1、http:/ 创 建 型 模 式 概 述 各 种 创 建 型 模 式 的 介 绍 各 种 创 建 型 模 式 的 结 构 图 各 种 创 建 型 模 式 的 示 例 各 种 创 建 型 模 式 的 优 缺 点 比 如 要 求 开 发 一 个 界 面 程 序 , 该 界 面 中 包 含 有 按 钮 、 文 本 框 等 控 件 , 要 求 按钮 、 文 本 框 等 控 件 , 并 希 望 能 够 按 使 用 者 的 要 求 显 示 不 同 的 风 格 。 该项目使用抽象工厂(Abstract Factory)模式来处理按钮、文本框等的不同风格,程序中类之间的关系如图所示: Factory是一个抽象

2、工厂,定义了createButtonFace()和createTextFace()两个抽象方法。 ModernFactory是Factory的一个具体实现,它负责实例化ModernButton和ModernText对象。 ClassicalFactory是Factory的另一个具体实现,它负责实例化ClassicalButton和ClassicalText对象。 ModernButton和ClassicalButton类是ButtonFace的子类,分别代表按钮的不同风格 ModernText和ClassicalText类是TextFace的子类,分别代表文本框的不同风格。 什么是创建型模式

3、创建型模式,就是创建对象的模式,抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。创建型模式关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑。 所有的创建型模式都有两个永恒的主旋律: 它们都将系统使用的哪些具体类的信息封装起来 它们隐藏了这些类的实例是如何被创建和组织的 由于设计模式的原则,面向接口进行编程,而不是实现。 名称必须是构造函数,名称受限。 传统的创建,每次创建都会返回一个新的对象,然而在实际项目中需要某一个类仅创建一个实例,来反复使用已经创建的对

4、象。 传统的创建中构造函数返回的类型都是具体的类型,而使用工厂模式可以返回其子类型。 主要有以下几个方面的原因: 动态地确定创建哪些对象。 是谁创建这些对象,即是外部的对象,还是本身对象提供,或者静态的类继承。 动态决定怎样创建对象,是新建对象或是使用Cache,还是复制某个对象。 决定怎样组合或者表示这些对象。 在实际的系统中使用创建型模式创建对象时需要考虑到以下几点: 抽象工厂(Abstract Factory)模式又称为Kit模式,属于对象创建型模式,它拥有比简单工厂模式和工厂方法模式更高的抽象性,是所有工厂模式中最为抽象和最具一般性的形态。抽象工厂模式是一种重要的架构型组件(Archi

5、tectural Component),它负责提供统一的接口,用来生成一簇“相互关联”或者“相互依赖”的多态对象(Polymorphic Object)。抽象工厂模式的一个主要功能是它能够隔离要生成的具体产品类,由于这些类的实际类名都被隐藏在工厂里面,因此客户端根本不需要关心对它们进行实例化的细节。 模式介绍 抽 象 工 厂 模 式 结 构 图 如 下 : AbstractFactory:是抽象工厂模式的核心,它负责定义创建抽象产品对象的接口。任何在模式中用于创建具体产品对象的工厂类都必须从抽象工厂派生,并且实现由它所定义的所有工厂方法。 ConcreteFactory:是抽象工厂模式的对外接

6、口,它负责实现创建具体产品对象的内部逻辑。具体工厂与应用密切相关,可以被外界直接调用,创建所需要的产品。 AbstractProduct:是抽象工厂模式所创建的某一类产品对象的抽象父类,它负责描述某些具体产品所共有的公共接口。 ConcreteProduct(如ProductA ,ProductB):是抽象工厂模式的创建目标,所有创建的对象都是充当这一角色的某个具体产品类的实例。 public abstract class AbstractFactorypublic abstract Banditi createBanditi();public abstract Police createPo

7、lice();public class HardToyFactory extends AbstractFactorypublic Banditi createBanditi() return new HardBanditi(); public Police createPolice() return new HardPolice(); public class SimpToyFactory extends AbstractFactorypublic Banditi createBanditi() return new SimpBanditi(); public Police createPol

8、ice() return new SimpPolice(); public abstract class Policepublic abstract void policeAttack();public abstract void policeMove(); public abstract class Banditi public abstract void banditiAttack();public abstract void banditiMove();public class SimpPolice extends Police public void policeAttack()Sys

9、tem.out.println(初等级别玩具游戏中的CS战警攻击);public void policeMove()System.out.println(初等级别玩具游戏中的CS战警移动);public class HardPolice extends Policepublic void policeAttack() System.out.println(高等级别玩具游戏中的CS战警攻击);public void policeMove()System.out.println(高等级别玩具游戏中的CS战警移动); 该模式有如下好处:Abstract Factory 处理应用程序中对象的创建。客户

10、通过它可以不用直接与具体产品对象的实现打交道。只需要知道具体的Factory 就可以生成出系统所需要的对象。应用程序改变产品族容易。有助于系统中产品的一致性。该模式下应用程序中使用的产品肯定是一个具体工厂生产出来的。 抽象工厂模式的缺点:在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为AbstractFactory接口规定了所有可能被创建的产品集合,要支持新种类的产品就需要对该接口进行扩展,而这将涉及到对AbstractFactory及其所有子类的修改。 Builder模式即建造模式或生成器模式,用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。B

11、uilder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。并且用户不知道内部的具体构建细节。 模式介绍 主要适用于以下情况: 当构造过程必须允许被构造的对象有不同的表示时; 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时。 建 造 模 式 结 构 图 如 下 : Builder(抽象生成器):为要创建Product对象的各个组成部件指定抽象接口。 ConcreteBuilder(具体生成器):实现Builder接口来构造和装配该产品的各个部件。 Director(导向器):构造一个使用Builder接口的对象。 Product

12、(产品):表示被构造的复杂对象。 public abstract class Builder /创建部件,比如创建处理器public abstract void builderProcessor(String partA); /创建部件,比如主板 public abstract void builderMainBoard(String partB); /创建部件,比如创建显示器 public abstract void builderDisplay(String partC); /*返回最后组装成品结果,即组装好的电脑, 下面我们将以字符串作为返回的产品。 实现过程和部件成品的组装过程不在这里

13、进行, 而是转移到下面的Director类中进行。 */ public abstract String getResult(); public class Director Builder builder;public Director(Builder builder)this.builder=builder;public void construct( ) builder.builderProcessor(处理器);builder.builderMainBoard(主板);builder.builderDisplay(显示器);public class ConcreteBuilder ext

14、ends BuilderString product=; public void builderProcessor(String processor)product+=组装+processor+n; public void builderMainBoard(String mainBoard) product+=组装+mainBoard+n; public void builderDisplay(String display)product+=组装+display;public String getResult()return product; Builder模式的优势:(1)使你可以改变一个产

15、品的内部表示。Builder对象提供给导向器一个构造产品的抽象类,该抽象类使得生成器隐藏该产品的表示和结构,因为产品是通过抽象类构造的,那么你在改变产品的内部表示时,只需要重新定义一个新的生成器。(2)它使你对产品的构造过程可以进行更精细的控制。Builder模式是在导向器的控制下,一步一步构造产品的。因此Builder模式能很好的反映产品的构造过程,这就使得你可以更精细的控制产品的构造过程。缺点:Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。 Factory Method模式即工厂方法模式,它定义了一个创建对象的抽象类(接口),

16、但是却让子类来决定具体实例化哪一个类。当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时,我们就需要用到Factory Method模式了。Factory Method可以根据不同的条件产生不同的实例,但这些不同的实例通常是属于相同的类型,并具有共同的父类。 模式介绍 比如JFC中的BorderFactory就是一个很好的例子,BorderFactory提供标准Border对象的工厂类。在任何可能的地方,此工厂类都将提供对已共享Border实例的引用。 工 厂 方 法 模 式 结 构 图 如 下 : Product:需要创建的产品的抽象类。 ConcreteProduct

17、:Product类的具体实现,一系列具体的产品。 Creator:抽象创建器接口,声明工厂方法,返回Product类型对象。 ConcreteCreator:具体的创建器,重写Creator中的factoryMethod()方法,返回ConcreteProduct类型的实例。 public abstract class TeacherProduct public abstract void teach( );public abstract void erase( );public String bookName;public TeacherProduct(String bookName)thi

18、s.bookName=bookName;public abstract class TeacherFactory protected abstract TeacherProduct factoryMethod(String bookName);/ 在anOperation中定义老师实例的一系列行为public void anOperation(String bookName)TeacherProduct teacher= factoryMethod(bookName);System.out.println(招聘了一个老师,老师所属科目是:+bookName);teacher.teach();

19、teacher.erase();public class ChineseTeacherFactory extends TeacherFactoryprotected TeacherProduct factoryMethod(String bookName)return new ChineseTeacher(bookName); public class MathTeacherFactory extends TeacherFactoryprotected TeacherProduct factoryMethod(String bookName)return new MathTeacher(boo

20、kName); Builder模式的优势:(1)基于工厂角色和产品角色的多态性,设计是工厂方法模式的关键,它使得工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。 (2)在系统中加入新产品时,不需要对抽象工厂和抽象产品提供的接口进行修改,而只要添加一个具体工厂和具体产品就可以了。缺点在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,当两者都比较简单时,系统的额外开销相对也会较大。 Prototype模式即原型模式,原型模式其实是一个比较单纯的设计模式,其目的就是利用一个原型对象,快速地生成一批对象,从而避免重复的新建过程。工作原理是:通

21、过将一个原型对象传给一个要新建的对象,新建对象通过请求原型对象拷贝它们,然后自己来实施创建。 模式介绍 主要适用于以下情况: 构建函数相对比较复杂。 构建函数不能被不相关的人调用。 一批对象中绝大部分对象的属性一致,而只有极少数不同。 原 型 模 式 结 构 图 如 下 : Prototype:声明一个克隆自身的接口或抽象类。 ConcretrPrototype:实现一个克隆自身的操作。 Client:让一个原型来克隆自身从而创建一个新的对象。 import java.awt.*;public class Client public static void main(String args)

22、BilliardsPrototype billiard1=new BilliardsPrototype();BilliardsPrototype billiard2=(BilliardsPrototype)billiard1.clone();BilliardsPrototype billiard3=(BilliardsPrototype)billiard1.clone();billiard1.setBilliardColor(Color.BLUE);billiard1.setBilliardName(1);System.out.println(billiard1.getBilliardName

23、()+号,蓝色创建成功);billiard2.setBilliardColor(Color.red);billiard2.setBilliardName(5);System.out.println(billiard2.getBilliardName()+号,红色创建成功);billiard3.setBilliardColor(Color.red); import java.awt.*;public class BilliardsPrototype implements CloneableString billiardName;Color billiardColor;public void se

24、tBilliardName(String billiardName) this.billiardName = billiardName;public String getBilliardName() return this.billiardName;public void setBilliardColor(Color billiardColor) this.billiardColor = billiardColor;public Color getBilliardColor() return this.billiardColor;public Object clone() Object obj

25、ect = null;try object =super.clone();catch (CloneNotSupportedException e)System.out.println(e);return object; Prototype模式主要有以下几点优势:Prototype模式允许客户只通过注册原型实例就可以将一个具体产品类加入到系统中,客户可以在运行时建立和删除原型。 减少了子类构造,Prototype模式是克隆一个原型而不是请求工厂方法创建一个原型,所以它不需要一个与具体产品类平行的Creater类层次。 Portotype模式具有给一个应用软件动态加载新功能的能力。 产品类不需要非

26、得有任何事先确定的等级结构,因为Prototype模式适用于任何的等级结构。 在有些情况下克隆功能不容易实现,特别是遇到对象的循环引用时。而且一个类必须配备一种克隆方法。这种克隆方法需要对类的功能进行通盘考 虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。 Prototype模式不足 主要适用于以下情况: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 实现要点及其注意的问题 Singleton模式是限制而不是改进类的创建。 Singleton中的实例构造器可以

27、设置为protected以允许子类派生。 Singleton模式一般不要支持Cloneable接口 和序列化。 Singleton只考虑了对象创建的管理,没有考虑到销毁的管理 。理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。 可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。 单 例 模 式 结 构 图 如 下 : Singleton:定义一个instance( )方法,允许客户端访问它的唯一实例。还负责创建它的唯一实例。 比如在连接数据库时,就希望数据库连接对象受到一定的限制,必须保持同一时间只能有一个连

28、接的存在,使用单例模式就可以很好的完成这一功能。 import java.sql.*;public class Singleton private static Singleton s=null;Connection con;private Singleton()try String classforname =com.microsoft.jdbc.sqlserver.SQLServerDriver;String url =jdbc:microsoft:sqlserver:/localhost:1433;databasename=pubs;Class.forName(classforname)

29、;con = DriverManager.getConnection(url, sa, );catch(Exception e)System.out.println(e); public static Singleton getInstance() if (s = = null)s = new Singleton();return s;这种方式的实现对于线程来说并不是安全的, 另一种方式是在static 后加synchronized就是对于线程安全的 Singleton模式主要有以下几点优势:对唯一实例的受控访问。 自行实例化并向整个系统提供这个实例单例模式。 Singleton模式不足可能的

30、开发混淆,开发人员必须记住自己不能使用new关键字实例化对象。 对象的生存期问题 程 序 的 实 现 要 求 如 下 :( 1) 创 建 抽 象 工 厂 类 Factory。( 2) ModernFactory和 ClassicalFactory是 Factory的 具 体 实 现 , 分 别负 责 实 例 化 ModernButton和 ModernText对 象 、 ClassicalButton和 ClassicalText对 象 。( 3) 创 建 ModernButton、 ClassicalButton和 ButtonFace类 , ModernButton和 ClassicalButton类 是 ButtonFace类 的 子 类 。 创 建 ModernText、ClassicalText和 TextFace类 , ModernText和 ClassicalText类 是 TextFace类 的 子 类 。 创 建 型 模 式 概 述 各 种 创 建 型 模 式 的 介 绍 各 种 创 建 型 模 式 的 结 构 图 各 种 创 建 型 模 式 的 示 例 各 种 创 建 型 模 式 的 优 缺 点

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!