Java Design Pattern(2)

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

此模式属于创建型设计模式,它只定义创建对象的接口,而由它的子类负责创建具体的对象,利用子类实例化不同的对象。图一是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)无关,增强了代码可重用性,因为它独立于用户定义的具体的类。

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

二、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 中对这个变量进行判断,若没有实例化过就产生一个新的对象,如果已经实例化了则不再产生新的对象,仍然返回以前产生的实例.

三、Prototype 原型模式:the same as clone()

1、定义:原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个对象的方法来创建更痛类型的对象。

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

3、使用时机:系统需要 创建吃的对象是动态加载的,而且产品具有一定层次时,可以考虑使用原型模式。

扫描二维码关注公众号,回复: 6507278 查看本文章

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

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

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

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

4、效果:

>可以再运行时刻增加和删除产品。

>可以通过改变值来指定产品。

>可以通过改变结构来指定新对象。

>减少子类的构造

>可以用类动态配置应用。

5、实现:

>使用一个原型管理器

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

>初始化克隆对象。

6、使用原型模式的意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

7、解决的问题:

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

Clone:

赋值创建对象:

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

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

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

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

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

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

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

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

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

链接:https://www.cnblogs.com/YLY9595TYJ/p/10681288.html

猜你喜欢

转载自www.cnblogs.com/BleachCurtain/p/11029698.html