IT培训分享Java常见设计模式

Python013

IT培训分享Java常见设计模式,第1张

正常情况下一个设计模式描述了一个被证实可行的方案。这些方案非常普遍,是具有完整定义的最常用的模式。IT培训http://www.kmbdqn.com/认为一般模式有4个基本要素:模式名称(patternname)、问题(problem)、解决方案(solution)、效果(consequences)。常见的Java设计模式有以下10种:

1、桥梁模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

2、合成模式(Composite):将对象组合成树形结构以表示"部分-整体"的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。

3、抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

4、装饰模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,它能生成子类的方式更为灵活。

5、适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口或类不兼容而不能一起工作的类可以一起工作。

6、责任链模式(ChainofResponsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

7、工厂方法(FactoryMethod):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。FactoryMethod使一个类的实例化延迟到其子类。

8、建造模式(Builder):将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。

9、门面模式(Facade):为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

10、命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化对请求排队或记录请求日志,以及支持可取消的操作。

.饿汉式单例类

//饿汉式单例类.在类初始化时,已经自行实例化

public class Singleton1 {

//私有的默认构造子

private Singleton1() {}

//已经自行实例化

private static final Singleton1 single = new Singleton1()

//静态工厂方法

public static Singleton1 getInstance() {

return single

}

}

2.懒汉式单例类

//懒汉式单例类.在第一次调用的时候实例化

public class Singleton2 {

//私有的默认构造子

private Singleton2() {}

//注意,这里没有final

private static Singleton2 single=null

//静态工厂方法

public synchronized static Singleton2 getInstance() {

if (single == null) {

single = new Singleton2()

}

return single

}

}

//对懒汉式单例的改进(错误的改进)

//实际上,只有在第一次创建对象的时候需要加锁,之后就不需要了 ,这样可以提升性能

public synchronized static Singleton2 getInstance() {

if (instance == null) {

synchronized(instance){ //锁住当前实例对象

if(instance == null){

instance = new Singleton2()

}

}

}

return instance

}

错误原因:

a>A、B线程同时进入了第一个if判断

b>A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton()

c>由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。

d>B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。

e>此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。

正确改进(使用内部类):

JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,JVM能够帮我们保证instance只被创建一次,

并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心上面的问题。

同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题

public?class?Singleton?{??

??

/*?私有构造方法,防止被实例化?*/??

private?Singleton(){

}

/*?此处使用一个内部类来维护单例?*/??

private?static?class?SingletonFactory?{??

private?static?Singleton?instance?=?new?Singleton()??

}

/*?获取实例?*/??

public?static?Singleton?getInstance()?{??

return?SingletonFactory.instance??

}

/*?如果该对象被用于序列化,可以保证对象在序列化前后保持一致?*/??

public?Object?readResolve()?{??

return?getInstance()??

}

}

其实说它完美,也不一定,如果在构造函数中抛出异常,实例将永远得不到创建,也会出错????

第二种改进:

因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,

单独为创建加synchronized关键字,也是可以的

public class Singleton {

private static Singleton instance=null

private Singleton(){}

private static synchronized void Init(){

if(instance==null)

instance=new Singletion()

}

public static Singleton getInstance(){

if(instance==null){

Init()

}

return instance

}

}

3.登记式单例类

import java.util.HashMap

import java.util.Map

//登记式单例类.

//类似Spring里面的方法,将类名注册,下次从里面直接获取。

public class Singleton3 {

private static Map<String,Singleton3>map = new HashMap<String,Singleton3>()

static{

Singleton3 single = new Singleton3()

map.put(single.getClass().getName(), single)

}

//保护的默认构造子

protected Singleton3(){}

//静态工厂方法,返还此类惟一的实例

public static Singleton3 getInstance(String name) {

if(name == null) {

name = Singleton3.class.getName()

System.out.println("name == null"+"--->name="+name)

}

if(map.get(name) == null) {

try {

map.put(name, (Singleton3) Class.forName(name).newInstance())

} catch (InstantiationException e) {

e.printStackTrace()

} catch (IllegalAccessException e) {

e.printStackTrace()

} catch (ClassNotFoundException e) {

e.printStackTrace()

}

}

return map.get(name)

}

//一个示意性的商业方法

public String about() {

return "Hello, I am RegSingleton."

}

public static void main(String[] args) {

Singleton3 single3 = Singleton3.getInstance(null)

System.out.println(single3.about())

}

}

JAVA中使用设计模式写代码能使代码重用、直观、可靠,共有23种设计模式,分别是:

创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式;

结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式;

行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式,