Java设计模式

来源:互联网 发布:游戏编程图书 编辑:程序博客网 时间:2024/05/18 03:15

单例模式:

   概述:

       单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供。

   优点:

       在内存中只存在一个对象,可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式可以提高系统的性能。

   缺点:

没有抽象层,因此难扩展

        职责过重,在一定程序上违反了单一原则。

   饿汉:

public class Singleton{      private Singleton singleton=new Singleton();      public static Singleton getInstance(){         return singleton;    }}
   静态内部类:

public class Singleton{   private static class SingeletonHolder{     private static final Singleton INSTANCE=new Singleton();   }   private Singleton{}   public static final getInstance(){    return SingletionHolder.INSTANCE;   }}



装饰者模式:

概述:

装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承替代方案。

优点:

使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意组合这些功能。

缺点:

正因为可以随意组合,所以就可能出现一些不合理的逻辑。

public interface Phone{    public void call();}

public class Iphone implements Phone{    public void call(){       System.out.println("打电话");    }}

/***装饰者类*/public abstract class PhoneDecoration implements Phone{     private Phone p;     public PhoneDecoration(Phone p){          this.p=p;     }     public void call(){          this.p.call();     }}

//对手机装饰彩铃public class RingDemo implements  PhoneDecotation{   public RingDemo(Phone p){              super(p);   }   public void call(){     System.out.println("听彩铃");     super.call();   }}
//对手机装饰听音乐public class MusicDemo implements PhoneDecotation{     public MusicDemo(Phone p){          super(p);     }     public void call(){          super.call();          System.out.println("听音乐");      }}
//测试package cn.decotation.test;public class Test {public static void main(String[] args) {Phone p = new IphoneDemo();// 需求:打电话前听彩铃Decoration d = new RingDemo(p);d.call();System.out.println("-----------------");// 需求:打电话后听音乐d = new MusicDemo(p);d.call();System.out.println("-----------------");// 需求:打电话前听彩铃,打电话后听音乐d=new RingDemo(new MusicDemo(p));d.call();}}


模板设计模式:

概述:

模板方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现

优点:

使用模板方法模式,在定义算法骨架的同时,可以灵活的实现具体的算法,满足用户灵活多变的需求。

缺点:

如果算法骨架有修改的话,则需要修改抽象类.

public abstract Template{         public long calculation(){            long start=System.currentTimeMillis();            code();            long end=System.currentTimeMillis();            return end-start;     }     public abstract void code();}
public class ForDemo extends Template{      @Overridepublic void code() {for (int i = 0; i < 10000; i++) {System.out.println(i);}}   }
public class CopyDemo extends Template{      @Overridepublic void code() {try {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:/js/Penguins.jpg"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:/js/b.jpg"));byte[] bytes = new byte[1024];int len = 0;while ((len = bis.read(bytes)) != -1) {bos.write(bytes, len, 0);}bis.close();bos.close();} catch (Exception e) {e.printStackTrace();}}}
package cn.template.test;public class Test {public static void main(String[] args) {Template t = new CopyDemo();long time=t.calculation();System.out.println(time+" 毫秒");}}


















0 0