一、设计模式简介及分类####
所谓模式,就是套路、固定的代码。对于设计模式,重要的是思维和思考方式的转变。
-
创建型模式
单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。 -
结构型模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 -
行为型模式
模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
二、常用设计模式####
1、单例模式
保证一个类只有一个实例,并且提供一个范围该实例的全局访问点。配置文件类,连接池,application(共享),控制器对象,Bean对象等均采用该模式。考察的几个要点:线程安全、效率、延时加载。
主要形式
- 懒汉式
线程安全,效率高,不能延时加载。一开始就创建了对象(所以不具有延迟加载),后来无论如何访问都是同一个对象。 - 饿汉式
线程安全,效率低,延时加载。调用时才创建对象,因为对象还没创建,所以在高并发的情况下,可能得到不同的对象,所以要使用同步(synchronized)[1],降低了效率。 - 双重检测锁式
- 静态内部类式
- 枚举单例
除枚举单例外,前4种方式有反射(reflaction)[2]和序列化漏洞,可构造不同对象。
2、工厂模式
设计模式的灵魂就是分工,分工能够组织庞大的项目,类和对象越多的话,只有分工分的越细,整个项目才更容易扩展。而工厂模式就是实现创建者和使用者的分离。这里要提一下面向对象的三个设计原则。
a、OCP原则(开闭原则):一个软件的实体应当对扩展开放,对修改关闭。
b、DIP原则(依赖反转):要针对接口编程,不要针对实现编程。
c、LoD原则(迪米特原则):只与你直接的朋友通信,而避免和陌生人通信。
主要形式
在介绍之前,先举一个未使用工厂模式例子,以便说明工厂模式。
- 简单工厂模式
划分层级,实现依赖的分离,隐藏细节。不完全实现OCP原则
- 工厂方法模式
- 抽象工厂模式
上面两个模式都是在创建同一个接口下的子类,如果创建多个接口下的子类,就需要用到抽象工厂模式。
-
synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用。 ↩ - ↩