Java和Scala学习日记3

来源:互联网 发布:js文件 syntax error 编辑:程序博客网 时间:2024/06/11 04:35

1. 设计模式的类型

解析:

(1)创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用new运算符直接实

化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

  • 工厂模式(Factory Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 单例模式(Singleton Pattern)
  • 建造者模式(Builder Pattern)
  • 原型模式(Prototype Pattern)
(2)结构型模式:这些设计模式关注类和对象的组合。继承概念被用来组合接口和定义组合对象获得新功能方式。
  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 过滤器模式(Filter、Criteria Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)
(3)行为型模式:这些设计模式特别关注对象之间的通信。
  • 责任链模式(Chain of Responsibility Pattern)
  • 命令模式(Command Pattern)
  • 解释器模式(Interpreter Pattern)
  • 迭代器模式(Iterator Pattern)
  • 中介者模式(Mediator Pattern)
  • 备忘录模式(Memento Pattern)
  • 观察者模式(Observer Pattern)
  • 状态模式(State Pattern)
  • 空对象模式(Null Object Pattern)
  • 策略模式(Strategy Pattern)
  • 模板模式(Template Pattern)
  • 访问者模式(Visitor Pattern)
(4)J2EE模式:这些设计模式特别关注表示层。这些模式是由Sun Java Center鉴定的。
  • MVC 模式(MVC Pattern)
  • 业务代表模式(Business Delegate Pattern)
  • 组合实体模式(Composite Entity Pattern)
  • 数据访问对象模式(Data Access Object Pattern)
  • 前端控制器模式(Front Controller Pattern)
  • 拦截过滤器模式(Intercepting Filter Pattern)
  • 服务定位器模式(Service Locator Pattern)
  • 传输对象模式(Transfer Object Pattern)
设计模式之间的关系,如下所示:


2. 工厂模式
解析:创建一个Shape接口和实现Shape接口的实体类(Circle,Square,Rectangle),然后定义工厂类ShapeFactory。FactoryPatternDemo演示类使用ShapeFactory获取Shape对象,它将向ShapeFactory传递信息(CIRCLE/RECTANGLE/SQUARE),以便获取它所需对象的类型。如下所示:
说明:复杂对象适合使用工厂模式,而简单对象,特别只需要通过new就可以完成创建的对象,无需使用工厂模式。

3. 抽象工厂模式
解析:创建Shape和Color接口和实现这些接口的实体类,然后创建抽象工厂类AbstractFactory。接着定义工厂类
ShapeFactory和ColorFactory,这两个工厂类都是扩展了AbstractFactory。然后创建一个工厂创造器/生成器类FactoryProducer。AbstractFactoryPatternDemo演示类使用 FactoryProducer来获取AbstractFactory对象。它将向AbstractFactory传递形状信息Shape(CIRCLE/RECTANGLE/SQUARE),以便获取它所需对象的类型。同时它还向AbstractFactory传递颜色信息Color(RED/GREEN/BLUE),以便获取它所需对象的类型。如下所示:

说明:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其它工厂,该超级工厂又称为其它工厂的
工厂,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

4. 单例模式   
解析:创建一个SingleObject类,它有它的私有构造函数和本身的一个静态实例。SingleObject类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo演示类用SingleObject类获取SingleObject对象。如下所示:

说明:单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种
访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。getInstance()方法中需要使用同步锁synchronized(Singleton.class)防止多线程同时进入造成instance被多次实例化。
(1)单例模式之懒汉式(线程不安全)
解析:是否Lazy初始化:是;是否多线程安全:否;实现难度:易。如下所示:
public class Singleton {      private static Singleton instance;      private Singleton (){}        public static Singleton getInstance() {      if (instance == null) {          instance = new Singleton();      }      return instance;      }  }  
(2)单例模式之懒汉式(线程安全)
解析:是否Lazy初始化:是;是否多线程安全:是;实现难度:易。如下所示:
public class Singleton {      private static Singleton instance;      private Singleton (){}      public static synchronized Singleton getInstance() {      if (instance == null) {          instance = new Singleton();      }      return instance;      }  } 
(3)单例模式之饿汉式
解析:是否Lazy初始化:否;是否多线程安全:是;实现难度:易。如下所示:
public class Singleton {      private static Singleton instance = new Singleton();      private Singleton (){}      public static Singleton getInstance() {      return instance;      }  }  
(4)单例模式之双检锁/双重校验锁(DCL,即 double-checked locking)
解析:JDK版本:JDK1.5起;是否Lazy初始化:是;是否多线程安全:是;实现难度:较复杂。如下所示:
public class Singleton {      private volatile static Singleton singleton;      private Singleton (){}      public static Singleton getSingleton() {      if (singleton == null) {          synchronized (Singleton.class) {          if (singleton == null) {              singleton = new Singleton();          }          }      }      return singleton;      }  }  
(5)单例模式之登记式/静态内部类
解析:是否Lazy初始化:是;是否多线程安全:是;实现难度:一般。如下所示:  
public class Singleton {      private static class SingletonHolder {      private static final Singleton INSTANCE = new Singleton();      }      private Singleton (){}      public static final Singleton getInstance() {      return SingletonHolder.INSTANCE;      }  }   
(6)单例模式之枚举
解析:JDK版本:JDK1.5起;是否Lazy初始化:否;是否多线程安全:是;实现难度:易。如下所示:
public enum Singleton {      INSTANCE;      public void whateverMethod() {      }  }  
说明:通常,不建议使用第(1)种和第(2)种懒汉方式,建议使用第(3)种饿汉方式。只有在要明确实现lazy 
loading效果时,才会使用第(5)种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第(6)种枚举方式。如果有其它特殊的需求,可以考虑使用第(4)种双检锁方式。

参考文献:
[1] 设计模式:http://www.runoob.com/design-pattern/design-pattern-tutorial.html  
原创粉丝点击