第三周第六组小组作业
一、创建型模式定义:创建型模式旨在将系统与它的对象创建、结合、表示的方式分离。这些设计模式在对象创建的类型、主体、方式、时间等方面提高了系统的灵活性
二、创建型模式模式分类
1、从目的来看:
创建型模式:负责对象创建
结构型模式:处理类与对象间的组合
行为型模式:类与对象交互中的职责分配
2、从范围来看:
类模式处理类与子类的静态关系
对象模式处理对象间的动态关系
三、什么是创建型模式:
创建型设计模式就是把对象的创建和对象的使用分离开。在软件工程中,创建模式是处理对象创建的模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上出现问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。
创建模式由两个主导思想构成。一是将系统使用的具体类封装起来,二是隐藏这些具体类的实例创建和结合的方式。
创建模式又分为对象创建型模式和类创建型模式。对象型创建模式处理的对象的创建,类创建型模式处理类的创建。详细的说,对象创建模型把对象创建的一部分推迟到另一个对象中,而类创建型模型将他的对象的创建推迟到子类中。
工厂模式:专门负责将大量有共同接口的类实例化。可以动态动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。
工厂模式有一下几种形态:简单工厂模式,工厂方法模式,抽象工厂模式。
设计模式需要的四个要素:
模式名称一个助记名,问题描述了应该在何时使用模式。
解决方案描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。
效果:描述了模式应用的效果及使用模式应权衡的问题。
在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。
创建型模式由两个主导思想构成。一是将系统使用的具体类封装起来,二是隐藏这些具体类的实例创建和结合的方式。
创建型模式又分为对象创建型模式和类创建型模式。对象创建型模式处理对象的创建,类创建型模式处理类的创建。详细地说,对象创建型模式把对象创建的一部分推迟到另一个对象中,而类创建型模式将它对象的创建推迟到子类中。
四、创建型模式的使用:现代软件工程更加依赖对象的组合,而不是类的继承,强调从硬编码的行为转变到定义一组基本行为来组合成复杂的行为。硬编码的行为不够灵活,因为如果想要改变设计的一部分,需要通过重写或者重新实现才能完成。另外,硬编码没有提高重用性,而且难以跟踪错误。由于这些原因,创建型模式比硬编码的行为更有用。创建型模式使设计变得更灵活,提供了不同的方式,从代码中移除了对需要实例化的具体类的引用。换句话说,这些模式增强了对象和类之间的独立性。
在以下情况中,可以考虑应用创建型模式:
1、一个系统需要和它的对象和产品的创建相互独立。
2、一组相关的对象被设计为一起使用。
3、隐藏一个类库的具体实现,仅暴露它们的接口。
4、创建独立复杂对象的不同表示。
5、一个类希望它的子类实现它所创建的对象。
6、类的实例化在运行时才指定。
7、一个类只能有一个实例,而且这个实例能在任何时候访问到。
8、实例应该能在不修改的情况下具有可扩展性。
举例:创建型设计模式的一些例子如下:
1、抽象工厂模式,提供一个创建相关或依赖对象的接口,而不指定对象的具体类。
2、工厂方法模式,允许一个类的实例化推迟到子类中进行。
3、生成器模式,将一个复杂对象的创建与它的表示分离,使同样的创建过程可以创建不同的表示。
4、延迟初始化模式,将对象的创建,某个值的计算,或者其他代价较高的过程推迟到它第一次需要时进行。
5、对象池模式,通过回收不再使用的对象,避免创建和销毁对象时代价高昂的获取和释放资源的过程。
6、原型模式,使用原型实例指定要创建的对象类型,通过复制原型创建新的对象。
7、单例模式,保证一个类只有一个实例,并且提供对这个实例的全局访问方式。
五、动机:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑性正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?这应该是设计者的责任,而不是使用者的责任。
单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
一、单例模式的使用场景:
- 1、要求生产唯一序列号。
- 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
二、 单例模式的实现:
- 我们将创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。
- SingleObject 类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo 类使用 SingleObject 类来获取 SingleObject对象。
· 步骤 1
- 创建一个 Singleton 类。
· 步骤 2
- 从 singleton 类获取唯一的对象。
· 步骤 3
- 执行程序,输出结果:
· Hello World!
三、单例模式的几种实现方式
1、懒汉式,线程不安全
2、懒汉式,线程安全
3、饿汉式
4、双检锁/双重校验锁
5、登记式/静态内部类
6、枚举
四、单线程Singleton模式的几个要点
·Sinaleton模式中的实例构造器可以设置为protected以允许子类派生。
·Sinaleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与 Singleton模式的初衷违背。
·Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与 Singleton模式的初衷违背。
·Sinaletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收 的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
·不能成多线积环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的 多个实例对象。
Abstract Factorv模式的几个要点
·如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式, 这时候使用简单的静态工厂完全可以。
·“系列对象”指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“ 道路”与“房屋”的依赖“道路”与“地道”的依赖。
·Abstract Factorv模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对 象”的需求变动。
·Atbstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。
五、耦合关系
耦合关系直接决定着软件面对变化时的行为
·模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改
·模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他 模块保持不变
六、Prototype模式的几个要点
·Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同 样要求这些“易变类”拥有“稳定的接口”。
·Prototvpe模式对于“如何创建易变类的实体对象”采用"原型克隆”的方法来做,它使得 我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象———所需工作仅仅是注册 一个新类的对象(即原型),然后在任何需要的地方不断地C
·Prototvoe模式中的Clone方法可以利用.NET中的Object的MemberwiseClone方法或者序列 化来实现深拷贝。
·Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决 的都是new所带来的耦合关系。
·Factory Method, Abstract Factory, Builder都需要一个额外的工厂类来负责实例化“ 易变对象”,而Prototype则是通过原型一个特殊的工广类)来克隆“易变对象”。
·如果遇到“易变类”,起初的设计通常从FactoryMethod开始,当遇到更多的复杂变化时,在 考虑重构为其他三种工厂模式( Abstract Factory,Builder , Prototype) 。
UML
一、交互视图
交互视图描述了实现系统行为角色之间的消息交换序列。分类角色是对交互中充当特殊
角色的对象的描述 从而使该对象区别于相同类的对象,视图提供了系统中行为全局的描
述--它显示了多个对象间的控制流程。交互视图用侧重点不同的两种图来显示 顺序图
二、和协作图。
顺序图表示了随时间安排的一系列消息,每个分类角色显示为一条生命线--代表整个交互期间上的角色。消息则显示为生命线之间的箭头。顺序图可以表达场景--即一项事务的特定历史。
顺序图的一个用途是显示用例的行为序列。当行为被实现,每个顺序图中的消息同类的操作或状态机中迁移上的事件触发相一致。
协作图的一个用途是表现操作的实现。协作显示了操作的参数和局部变量,以及更永久性的关联。当行为被实现时,消息的顺序与程序的嵌套调用结构和信号传递一致。
三、状态视图
状态机对类的对象的可能生命历史建模。状态机包含由迁移连接的状态。每个状态对对象生命期中的一段时间建模,该时间内对象满足一定的条件 当事件发生时。它可能导致
迁移的激发,使对象改变至新状态。当迁移激发时,附属于迁移的动作可能被执行。状态机显示为状态图。
四、活动视图
活动视图是用于显示执行某个计算过程中的运算活动的状态机的一种变形。活动状态表现了一项活动:工作流的步骤或操作的执行。活动图描述了顺序和并发活动分组。活动视
图表达为活动图。
状态图:是一种由状态、变迁、事件和活动组成的状态机,用来描述类的对象所有可能的状态以及时间发生时状态的转移条件。
活动图: 是状态图的一种特殊情况,这些状态大都处于活动状态。本质是一种流程图,它描述了活动到活动的控制流。
交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流。
活动图是一种表述过程基理、业务过程以及工作流的技术。
它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模。
区别:
状态图VS活动图
状态图和活动图都是行为图。状态图侧重从行为的结果来描述,活动图侧重从行为的动作来描述。状态图描述了一个具体对象的可能状态以及他们之间的转换。在实际的项目中,活动图并不是必须的,需要满足以下条件:1、出现并行过程&行为;2、描述算法;3、跨越多个用例的活动图。
活动图VS交互图
二者都涉及到对象和他们之间传递的关系。区别在于交互图观察的是传送消息的对象,而活动图观察的是对象之间传递的消息。看似语义相同,但是他们是从不同的角度来观察整个系统的。
静态构造器
1、定义:(什么是静态构造器)
静态构造函数是实现对一个类进行初始化的方法成员. 它一般用于对静态数据的初始化. 静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用.
2、特点:
在一个程序的执行过程中,静态构造器最多只执行一次.
3、执行顺序:
- 静态构造器在任何类的静态成员被引用之前执行.
- 静态构造器在任何类的实例变量被分配之前执行.
- 静态构造器在类的静态成员初始化之后执行.或者说编译器会将静态成员初始化语句转换成赋值语句放在静态构造器执行的最开始。
4、实例:
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("静态变量值 = " + Person.time);
- Person p1 = new Person();
- Thread.Sleep(10);
- Person p2 = new Person();
- Console.ReadKey();
- }
- }
- class Person
- {
- public static int time = DateTime.Now.Millisecond;
- static Person()
- {
- Thread.Sleep(10); // 防止电脑运行太快,看不出效果
- Console.WriteLine("静态构造器 = " + DateTime.Now.Millisecond);
- }
- public Person()
- {
- Console.WriteLine("无参构造器 = " + DateTime.Now.Millisecond);
- }
- }
5、运行结果



浙公网安备 33010602011771号