几种常用的设计模式介绍


构造器(Constructor)模式

实际上就是我们通常使用的一种最基本的类,其构造器带有参数。

比如:

function Car( model, year, miles ) {

 this.model = model; this.year = year; this.miles = miles; this.toString = function () { return this.model + " has done " + this.miles + " miles"; }; }  var civic = new Car( "Honda Civic", 2009, 20000 ); var mondeo = new Car( "Ford Mondeo", 2010, 5000 ); 
模块(Module)模式

模块模式是为类提供私有变量和特权方法(有权访问私有变量和私有函数的公有方法)的方法。在JavaScript,就可通过闭包的方式,模拟实现模块模式。

对象字面量:

复制代码
var myModule = { variableKey: variableValue, getKey: function () { // ...  } };
复制代码
严格上讲,对象字面量实现的只是不完整的模块模式,因为无法达到变量、方法私有效果。不过确实有分离和组织代码的能力,也就算一种简略的模块模式的实现方式

简单例子:

复制代码
var myModule = (function(){ var privateVar = 10; return { getPrivateVar : function(){ return privateVar; } } })();

 

 

揭示(Revealling)模块模式

 

这种是模块模式的改进版本,它是在模块代码底部,定义所有对外公布的函数(仅是指针)和变量。

 

复制代码
var myRevealingModule = (function () { var privateVar = "Ben Cherry", publicVar = "Hey there!"; function privateFunction() { console.log( "Name:" + privateVar ); } function publicSetName( strName ) { privateVar = strName; } function publicGetName() { privateFunction(); } // Reveal public pointers to // private functions and properties return { setName: publicSetName, greeting: publicVar, getName: publicGetName };   })();
复制代码

 

这种模式我经常使用,它很容易指出哪些函数和变量可以被公开访问,增强了可读性。

 

单例(Singleton)模式

单例模式它限制了类的实例化次数只能一次。在实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,它会简单返回该对象的引用。

它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。比如下面的例子代码(若属于多线程环境,需要考虑线程之间的同步):

/// <summary>
/// A simple singleton class implements. /// </summary> public sealed class Singleton { private static Singleton _instance = null; /// <summary> /// Prevents a default instance of the /// <see cref="Singleton"/> class from being created. /// </summary> private Singleton() { } /// <summary> /// Gets the instance. /// </summary> public static Singleton Instance { get { return _instance ?? (_instance = new Singleton()); } } }

工厂(Factory)模式

工厂模式提供一个通用的接口来创建对象。通常还可以细分为:简单工厂工厂方法抽象工厂模式。

简单工厂模式,就是将一些有共同点的对象,通过一个工厂来进行统一的方法来创建。这类模式通常是对对象的方法进行抽象,并在工厂类中调用各自类的构造方法,后续使用对象的抽象方法来调用实际对象的接口。个人觉得简单工厂模式跟构造模式有一些相似之处。

 

 工厂方法模式:可以看着是在简单工厂模式的基础上,增加一次对工厂的抽象,在实际的使用中,我们通过具体的工厂类来创建相应的对象。

抽象工厂模式:更加复杂的一种模式, 有抽象工厂、抽象对象,抽象工厂中有创建不同抽象对象的方法。即在工厂方法的基础上,为抽象工厂增加创建不同对象的接口而形成的一种代码组织。

 

 

这三种工厂模式一个比一个复杂,在实际使用时需要掂量一下,继续引用参考意见:

简单工厂模式最大的缺点是违背了“开闭原则”,当增加了新的产品时,需要去修改简单工厂类的结构。工厂方法模式主要是针对单一产品结构的情景,而抽象工厂模式是针对多级产品结构的场景。

 

OO的一些原则
 1.OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。也就是说,对于一个已有的软件,如果需要扩展,应当在不需修改
     已有代码的基础上进行。
  2.DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。简单点说,对于不同层次的编程,高层次暴露给低层次
     的应当只是接口,而不是它的具体类。
  3.LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。

 

可参见:https://wenku.baidu.com/view/60c6ca21192e45361066f5e0.html

 

中介者(Mediator)模式定义

中介者作为一种行为设计模式,它公开一个统一的接口,系统的不同对象或组件可以通过该接口进行通信。增加一个中介者对象后,所有的相关对象通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知中介者对象即可。

 

中介者模式与观察者模式差异

1. 调度中心不同。

中介者模式调度是由中介者,而观察者模式调度的是观察者;

中介者模式与订阅/发布模式的调度方式更像,都是独立一个集中的调度中心。

2. 中介者模式参与了对象行为的实现(例如上面示例的飞机起飞),而观察者模式并不参与,仅做目标通知。

中介者模式与订阅/发布模式差异

1. 中介者模式与业务相关,订阅/发布模式与业务无关。(这是我觉得最大差别)

虽然实现结构非常相像,但是很明显的是,中介者模式参与业务相关东西,所以内容是大相径庭的。

2. 两个模式都有集中调度效果,对象之间不直接参与通信。

 

原型(prototype)模式定义

原型模式(创建型设计模式)是用一个对象做模板,克隆出新对象。

另外原型模式中的克隆分为"浅克隆"和"深克隆":

浅克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象。

深克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制。

 

装饰者(Decorator)模式
定义:
给对象动态添加额外的功能。向基本对象添加(装饰)属性或方法,而不是进行子类化,它较为精简。
使用场景:
java IO 流是典型的装饰模式。
 

 

......

 

http://www.cnblogs.com/lovesong/category/839413.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM