/* 单例设计模式 思想: 1.不让其他程序创建该类对象。 2.在本类中创建一个本类对象。 3.对外提供方法,让其他程序获取这个对象。 代码体现: 1.私有化构造方法,目的是让其他程序无法创建该类对象。 2.创建私有并静态的本类方法。 3.定义共有并静态的方法,返回该类对象。 解决的问题:保证一个类在内存中的对象唯一性。 */ class Single { //单例设计模式:饿汉式 private Single(){} private static Single s=new Single(); public static Single getInstance(){ return s; } } class Single2 {// 单例设计模式:懒汉式,延迟加载方法 private Single2(){} private static Single2 s2=null; public static Single2 getInstance(){ if(s2==null) s2=new Single2(); return s2; } }
/* 模板方法设计模式 解决的问题:当功能内部一部分实现确实,一部分实现不确定。这时可以把不确定的部分暴露出去,让子类去实现。 */ abstract class GetTime{ public final void getTime(){ long start = System.currentTimeMillis(); code();//将不确定的部分,提取出来,通过抽象方法实现。 long end = System.currentTimeMillis(); System.out.println("毫秒是"+(end-start)); } public abstract void code();//抽象不确定的功能,让子类复写实现。 } class SubDemo extends GetTime{ public void code(){//子类复写功能方法 for(int i=0;i<1000;i++){ System.out.println(i); } } }
/* 装饰设计模式 解决的问题:对一组对象的功能进行增强时,就可以使用该模式进行问题的解决。 特点:装饰类和被装饰类都必须所属于同一个接口或者父类。 例 1: class Person{ public void Eat(){ System.out.println("吃饭"); } } class NewPerson{ private Person p; public void Eat(Person p){ System.out.println("开胃酒"); p.Eat(); System.out.println("甜点"); } } 装饰和继承都能实现一样的特点: 进行功能的拓展增强。 有什么区别呢? 例 2:首先有一个继承体系: Writer |--TextWriter:用于操作文本 |--MediaWriter:用于操作媒体 想要对操作的动作进行效率的提高。 按照面向对象,可以通过继承对具体的进行功能的扩展。 效率提高需要加入缓冲技术。 Writer |--TextWriter:用于操作文本 |--BufferTextWriter:加入缓冲技术的操作文本对象。 |--MediaWriter:用于操作媒体 |--BufferMediaWriter:加入缓冲技术的操作媒体对象。 到这里就可以了,但是这样做好像并不理想。 如果这个体系进行功能拓展,又多了流对象。 那么这个流要提高效率,是不是也要产生子类呢?
是,这是就会发现只为提高功能,进行的继承,导致继承体系越来越臃肿。不够灵活。
重新思考问题? 既然加入的都是同一种技术--缓冲 前一种是让缓冲和具体的对象相结合。 可不可以将缓冲进行单独的封装。那个对象需要缓冲就将那个对象和缓冲关联。 class Buffer extends Writer{ BufferWriter(Writer w){} } Writer |--TextWriter:用于操作文本 |--MediaWriter:用于操作媒体 |--BufferWriter:用于提高效率 装饰要比继承灵活。 */ class Person{ public void Eat(){ System.out.println("吃饭"); } } class NewPerson{ private Person p; public void Eat(Person p){ System.out.println("开胃酒"); p.Eat(); System.out.println("甜点"); } }