Java基础:设计模式

来源:互联网 发布:怎么领淘宝内部优惠券 编辑:程序博客网 时间:2024/04/30 00:59

1.单例设计模式

单例设计模式概述:
(1),为了避免其他程序过多的建立该类对象,禁止其他程序建立该类对象;
(2).为了让其他程序可以访问到该类的对象,要在本类中,自定义一个对象;
(3).为了方便其他程序对自定义对象的访问,要对外提供访问本类对象的方式;
(4).用枚举也可以实现单例;
具体在代码设计中的体现:
(1).将构造方法私有化;
(2).在类中创建一个本类对象;
(3).提供一个方法可以获取该类的对象;
实现单例设计模式的两种方式:
(1).饿汉式
/* * 单例设计模式的实现:饿汉式; */package com.zr.day10;class Single{//将构造方法私有化;private Single(){ }//创建本类对象;private static final Single s = new Single();//对外提供访问对象的方法public static Single getInstance(){return s;}}class SingleDemo{//获取单例中定义的对象;Single ss = Single.getInstance();}


(2).懒汉式:延时加载
/* * 单例设计模式的实现:懒汉式; */package com.zr.day10;class Single{//将构造方法私有化;private Single(){ }//定义本类对象,但是没有创建;private static Single s = null;//对外提供访问对象的方法public static Single getInstance(){//当需要的时候再创建;if(s==null)s = new Single();return s;}}class SingleDemo{//获取单例中定义的对象;Single ss = Single.getInstance();}

(3).懒汉式在多线程中的处理:
两种方式在单线程程序中都可以完美运行,区别是在多线程环境下可能会出现问题;
饿汉式在多线程中完美运行,但是懒汉式在多线程环境下,因为操作共享数据的语句有多条,判断操作和赋值操作可能会出现安全问题;
/* * 单例设计模式的实现:懒汉式; */package com.zr.day10;class Single{//将构造方法私有化;private Single(){ }//定义本类对象,但是没有创建;private static Single s = null;//对外提供访问对象的方法public static Single getInstance(){//每个调用该方法都线程都要判断锁,会导致效率比较低//所以使用多重判断,当还没有创建对象的时候再判断锁if(s==null){//给操作共享数据的代码添加同步//定义锁为class对象synchronized(Single.class){//当需要的时候再创建;if(s==null)//判断操作s = new Single();//赋值操作}}return s;}}class SingleDemo{//获取单例中定义的对象;Single ss = Single.getInstance();}


2.模块方法设计模式

基本概述:
在定义功能时,功能的定义是确定的,但是有一部分具体的实现是不确定的,确定的功能内部可能在调用不确定部分;
可以将不确定的部分暴露出去,由其子类去实现这部分的功能;将确定的功能用final修饰,不能被重写;
示例:获取某段代码获取的时间;
package com.zr.day10;abstract class GetTime{//整个功能的定义是确定的;//将这个确定的功能用final修饰,表示不能被复写;public final void getTime(){long start = System.currentTimeMillis();//不确定的实现部分,具体怎么实现可以由子类去实现;testcode();long end = System.currentTimeMillis();System.out.println(end - start);}//将该方法暴露出去,由其他子类实现public abstract void testcode();}class SubTime extends GetTime{//子类想要使用父类中定义好的功能就必须要复写没有实现的功能;public void testcode(){//具体操作代码;...}}


3.装饰设计模式

装饰设计模式在IO流体系中的体现,BufferedReader,BufferedWriter,BufferedInputStream,BufferedOutputStream等对IO流中的基类Reader,Writer,InputStream,OutputStream的装饰;
当需要对已有的对象进行功能上的增强时,可以自定义类,将已有的对象作为参数传入,通常是通过构造方法接收被装饰的对象,基于原有对象已经有的功能提供加强功能,那么这个自定义的类就成为了装饰类;
继承模式:每当需要对某个类的对象进行装饰时就定义该类的一个子类;
|--MyReader
|--MyTextReader
|--MyBufferedTextReader
|--MyMediaReader
|--MyBufferedMediaReader
|--MyDataReader
|--MyBufferedDataReader
装饰模式:在这个体系中建立一个类,将要装饰的对象作为传递;
|--MyReader
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferedReader
继承模式和装饰模式的区别:
(1).装饰模式比继承模式要灵活,避免继承体系的臃肿;
(2).降低了类和类之间的关系;
(3).装饰类增强已有的对象,其具备的功能和已有的功能是相同的,所以装饰类和装饰类通常同属于一个体系中;

4.享元设计模式:FlyWeight

在设计中定义有很多底层的对象,提供给其他对象使用;这些对象它们有很多相同的共性,也有一些不同的差异性,可以将相同的部分封装成一个对象,供其他对象共享使用,节省资源,那些差异性的地方则定义为外部状态,作为参数传递,根据需要类使用;
享元模式可以在一个复杂的系统中节省大量的空间;
在Java语言中String类型就是使用的享元模式,String类型对象是fianl类型,对象一旦被创建就不可以被改变,字符串常量都存在常量池中,只有一份,供其他调用者共享使用;同样在byte范围内的Integer数据也是使用的享元模式;
0 0
原创粉丝点击