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
阅读全文
1 0
- Java和Scala学习日记3
- Java和Scala学习日记1
- Java和Scala学习日记2
- Java和Scala学习日记4
- Java和Scala学习日记5
- Java和Scala学习日记6
- Java和Scala学习日记7
- Java和Scala学习日记8
- java学习日记3
- Scala学习7之scala与java不同之总结3-特质和接口
- Scala学习笔记13 - 结合scala和java
- Java学习日记3(过滤器)
- Java菜鸟学习日记3
- Java EE学习日记3
- 学习日记java 泛型和泛型类
- JAVA 学习日记(6).JSTL和EL
- java学习日记1(HttpSession和Cookie)
- Scala学习笔记3 - 类和对象
- 实习总结1
- Raspberry PI上操作GPIO(GPIO编程,远程控制GPIO)
- Java集合
- 实习总结2
- mysql binlog日志自动清理及手动删除
- Java和Scala学习日记3
- JAVA web
- 经典论文阅读——A Convolutional Neural Network Cascade for Face Detection
- Android APK DEX分包总结
- iOS远程真机之wdaproxy使用指南
- 【LintCode】Expression Expand
- BZOJ4198(Noi2015)[荷马史诗]--k叉哈夫曼树
- 用Linux命令执行CI框架
- 22.生产部署