Java和Scala学习日记3
程序员文章站
2022-06-15 14:17:36
...
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)种双检锁方式。
参考文献:
上一篇: 腊月初一吃什么传统食物
下一篇: 工厂方法模式
推荐阅读
-
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
-
Java学习笔记 DbUtils数据库查询和log4j日志输出 使用
-
java学习笔记(基础篇)—关键字static和final
-
MacOS配置Anaconda3(Miniconda3)下Python3.6、Python3.7和Python2.7环境和基础机器学习、神经网络相关包详解(版本号对应)
-
荐 opencv进阶学习笔记3:像素运算和图像亮度对比度调节
-
学习 JAVA,有什么书籍推荐?学习的方法和过程是怎样的?
-
ASP.NET MVC3学习心得-----视图和模型
-
Python学习之路-随笔02 python3的类和包
-
Java基础学习-基本数据类型变量的定义和使用
-
Python学习笔记(3)for循环和while循环