设计模式: 单列设计模式 、模块方法设计模式、装饰设计模式、工厂设计模式、适配器设计模式

面向对象的思想:

单一
开闭
里氏
依赖注入
接口
迪米特

设计模式:就是一种设计的经验的总结,有 创建、 行为、 结构  三种。

一、单列设计模式

    1、设计模式:解决某一类问题的最行之有效的方法。
    2、Java中有23中基本设计模式。
    3、单列设计模式:一个类在内存中只有一个对象。


  为了达到单列设计模式,如下考虑:
    1、 为了避免其他程序过多建立该类对象,所以要先禁止其他程序建立该类对象。
    2、 但是为了有一个该类对象可用,所以只有通过自己建立一个本类对象。
    3、 为了让其他程序使用该对象,所以要对外提一些访问方式。

  有了上述思考,于是有了如下步骤:
    1、 将其构造私有化 (使用 private 修饰构造函数)
    2、 在类中 new 一个本类对象。
    3、 提供一个 static 方法能调用到上步建立的对象。

  代码示例如下:
  class Single //饿汉式 (饿汉式在开发时更常用)
  {
    private Single(){}
    private static Single s = new Single();
    public static Single getInstans()
    {
      return s;
    }
  }

  class Single //懒汉式
  {

    private static Single s;
    private Single(){}

    public static Single getInstance()
    {
      if(s==null)
        s = new Single();
      return s;
    }
  }

  class Test
  {
    public static void main(String []args)
    {
      Single ss = Single.getInstans();
    }
  }


二、模板方法设计模式

    在定义功能时,部分功能时确定的, 部分功能时不确定的, 而确定功能在使用不确定的功能,
    我们就可以将不缺定的功能暴露出去,由子类去完成。
    而确定部分就使用 final封装起来。

三、装饰设计模式:

  描述:

      当想要对已有对象的功能进行加强的时候,可以定义类: 该类传入已有对象为参数,并基于已有对象的功能,提供更加强大的功能。
    那么,自定义的该类就是装饰类。

      装饰类通常会在构造函数中接受被装饰的对象,并基于被装饰的对象的功能提供更强大的功能。

  和继承的区别:

      继承体系 Futher
        |---Son1 extends Futher
          |--- SuperSon1 extends Son1
        |---Son2 extends Futher
          |--- SuperSon2 extends Son2
        |---Son3 extends Futher
          |--- SuperSon3 extends Son3

      装饰体系 Futher
        |---Son1
        |---Son2
        |---Son3
        |---class Super extends Futher
          {
            private Futher f;
            public Super(Futher f)
            {
              this.f= f;
            }
          }


   相比于继承,装饰模式比继承有更多的灵活性,避免了继承模式的臃肿。减低了类与类之间的关系。

   装饰因为是增强已有对象,具备的功能和已有的是相同的,只是提供了更强大的功能。
   所以装饰类和被装饰类通常都属于一个体系。

四、简单工厂模式

    


  又叫静态工厂模式,其定义个静态工厂类,负责创建一些类的实例(一类对象一个工厂)。
    优点:
      客户端不需要负责对对象的创建,从而明确了各个类的职责。
    缺点:
      这个静态工厂负责对所有的类的创建,如果有新的对象的增加,或者某些对象的创建方式不同,就需要不断的修改工厂,不利于后期维护。

五、工厂方法模式:
  工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的继承类实现(每种对象一个工厂)。

  优点:
    客户端不需要再负责对象的创建从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和一个具体的工厂类即可。
    不影响已有代码,后期维护容易,增强了系统的扩展性。
  缺点:
    需要额外的代码编写,增加了工作量。




六、适配器模式:


    对于一个有多个抽象方法的接口,有一个具体的类要实现此接口中的某一项功能,如果直接实现了该接口就会被要求实现其所有的抽象的功能。
  这显然不太合适,所以:
    我们写了一个实现该接口的Adapter类,该类空值的实现了接口中的所有功能, 我们只需要继承该Adapter类就可以让我们只复写其中的我们
  所需要的功能了。 这个Adapter类就叫适配器。

七、代理模式

 

  1.1、代理模式
    什么是代理模式及其作用
      Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一
      代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,
              一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客
              户端和目标对象之间起到中介的作用。
    优点:
      (1).职责清晰
        真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,
        通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

      (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。

      (3).高扩展性
    结构
      一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理
      对象实现同一个接口,先访问代理类再访问真正要访问的对象。


  1.2、动态代理
    动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。
    动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。
    动态代理生成技术:
      1.  jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象。
      2.  cglib (spring)

    Java.lang.reflect.Proxy类可以直接生成一个代理对象

    Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类
    ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
    Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
    InvocationHandler:策略(方案)设计模式的应用。如何代理?

    InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行
      Object proxy:代理对象本身的引用。一般用不着。
      Method method:当前调用的方法。
      Object[] args:当前方法用到的参数

原文地址:https://www.cnblogs.com/soficircle/p/6613697.html