Java Design Pattern(Factory,Singleton,Prototype,Proxy)

1、Factory 设计模式: the most common pattern,create a new object ,eg. A a=new A();工厂模式的好处:工厂模式能够作到把建立对象单独提出来,起到解耦做用,即:若是要修改建立对象的逻辑不用在项目里的各处修改了,只须要在工厂里面修改一处就能够了,大大缩短了修改的工做量.java

此模式属于建立型设计模式,它只定义建立对象的接口,而由它的子类负责建立具体的对象,利用子类实例化不一样的对象。图一是Factory Method 模式结构的类图(Class Diagram),其中:数据库

  1. Product 定义了由factory method所建立对象的统一接口。
  2. ConcreteProduct 具体的类,实现Product接口。
  3. Creator 通常为抽象类,声明若干factory method(方法),由它建立类型为Product的对象。正由于它能"生产"对象,因此称为factory method。Creator也可能拥有一个方法建立某个缺省的具体对象。
  4. ConcreteCreator 重载factory method以建立某个 ConcreteProduct 的具体实例。

也就是说Creator依赖于ConcreteCreator建立Product型的ConcreteProduct对象。 Factory method使应用程序代码只需处理Product接口,而与具体的类(ConcreteProduct)无关,加强了代码可重用性,由于它独立于用户定义的具体的类。设计模式

小结 工厂模式的适用范围 
• 在编码时不能预见须要建立哪种类的实例。 
• 一个类使用它的子类来建立对象。 
• 开发人员不但愿建立了哪一个类的实例以及如何建立实例的信息暴露给外部程序。安全

2、Singleton 单例模式: let one class only has one instance, something like static parameter, can save memory,
           beneficial to garbage collection            Singleton 是一种建立性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来讲,保证只有一个实例是很重要的,好比有的时候,数据库链接或 Socket 链接要受到必定的限制,必须保持同一时间只能有一个链接的存在.再举个例子,集合中的 set 中不能包含重复的元素,添加到set里的对象必须是惟一的,若是重复的值添加到 set,它只接受一个实例.JDK中正式运用了Singleton模式来实现 set 的这一特性,你们能够查看java.util.Collections里的内部静态类SingletonSet的原代码.其实Singleton是最简单但也是应用最普遍的模式之一,在 JDK 中随处可见.多线程

为了实现 Singleton 模式,咱们须要的是一个静态的变量,可以在不建立对象的状况下记忆是否已经产生过实例了.静态变量或静态方法均可以在不产生具体实例的状况下直接调用,这样的变量或方法不会由于类的实例化而有所改变.在图1的结构中能够看到,uniqueInstance 就是这个独立的静态变量,它能够记忆对象是否已经实例化了,在静态方法 Instance 中对这个变量进行判断,若没有实例化过就产生一个新的对象,若是已经实例化了则再也不产生新的对象,仍然返回之前产生的实例.编码

小结spa

  1. Singleton模式能够方便的进行扩充,产生指定数目的实例.
  2. 在The Design Patterns Java Companion 一书中曾提到过用静态类的方式来实现 Singleton模式,并指出java.lang.Math就是一个例子,这里我并不表示赞同,由于Math并非一个真正的对象,咱们只是直接调用Math类所包装的静态方法而已,根本就没有建立实例的过程,又从何提及只产生一个实例呢?这个问题我曾到Javaranch的论坛上发过帖子,全部回帖的人也都是对这一观点持否认态度.
  3. 在多线程的程序中,singleton可能会变的不可靠,可能会出现多个实例,解决的办法很简单,加个同步修饰符: public static synchronized Singleton getInstance(). 这样就保证了线程的安全性.
  4. 最后要说的是你们可能会看见一些其余实现Singleton模式的方法,由于模式在具体的应用时是灵活的,不是一成不变的,并无一个固定的作法,但大都是上面几种方法的变形.

3、Prototype 原型模式:the same as clone()线程

一、定义:原型模式就是经过一个原型对象来代表要建立的对象类型,而后用复制这个对象的方法来建立更痛类型的对象。设计

二、原理:有两部分组成,抽象原型和具体原型。代理

三、使用时机:系统须要 建立吃的对象是动态加载的,并且产品具备必定层次时,能够考虑使用原型模式。

>当要实例化的类是在运行时刻指定时,例如,经过动态装载;

>或者为了不建立一个与产品类层次平行的工厂类层次时;

>或者当一个类的实例只能有几个不一样状态组合中的一种时。

>创建相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

四、效果:

>能够再运行时刻增长和删除产品。

>能够经过改变值来指定产品。

>能够经过改变结构来指定新对象。

>减小子类的构造

>能够用类动态配置应用。

五、实现:

>使用一个原型管理器

>实现克隆操做(浅拷贝和深拷贝)

>初始化克隆对象。

六、使用原型模式的意图:用原型实例指定建立对象的种类,而且经过拷贝这些原型建立新的对象。

七、解决的问题:

好比有一个对象,在某一时刻该对象中已经包含了一些有效的值,此时可能会须要一个和该对象彻底相同的新对象,而且此后对新对象的任何改动都不会影响到原来对象中的值,也就是说新对象与原来的对象是两个独立的对象,但新对象的初始值是由原来的对象肯定的。

Clone:

赋值建立对象:

>java中赋值建立对象是能够实现对象的重用的,可是新对象和原对象是同一个引用;若是修改其中的一个对象的值,则另外的一个对象也会发生改变。

>使用clone方法会返回对象的一个拷贝,这样一来,若是修改一个对象的值,则另外的对象不会发生改变的。

4、Proxy 代理模式:一个类表明另外一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,咱们建立具备现有对象的对象,以便向外界提供功能接口。

代理模式涉及的角色: 
1:抽象主题角色.声明了代理主题和真实主题的公共接口,使任何须要真实主题的地方都能用代理主题代替. 

2:代理主题角色.含有真实主题的引用,从而能够在任什么时候候操做真实主题,代理主题功过提供和真实主题相同的接口,使它能够随时代替真实主题.代理主题经过持有真实主题的引用,不但能够控制真实主题的建立或删除,能够在真实主题被调用前进行拦截,或在调用后进行某些操做. 

3:真实代理对象.定义了代理角色所表明的具体对象.  

拦截机制是代理模式的重要使用方式之一, 
除了拦截,代理模式还经常使用于资源加载,当咱们要加载的资源很大时,咱们可让真实主题角色在后台加载资源,让代理主题角色负责处理前台的等待提示信息. 

还有就是受权机制,经过代理能拦截真实主题的能力,来控制真实主题的访问权限. 

相关文章
相关标签/搜索