设计模式的产生主要是使得软件能够更加的可维护、可扩展、可重用,增加软件的灵活性。
设计模式所涉及的七大原则有:
1.单一职责原则: 降低类的复杂度,一个类只负责一项职责,提高类的可读性,可维护性
2.接口隔离原则: 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小接口上
3.依赖倒置原则: 高层模块不依赖低层模块,二者都应该依赖其抽象,细节依赖抽象,核心思想是面向接口编程,实现方式有接口,构造器,setter方法。
4.里氏替换原则: 父类中实现的方法是在设定规范和契约,不要求子类必须遵循,但是子类对该方法任意修改,会对继承体系造成破坏,子类尽量不要重写父类方法,替换原则是使用聚合组合等关系解决继承的耦合性问题
5.开闭原则(open close principle): 一个软件模块或者一个类对扩展开放、对修改关闭,用抽象构建框架,用实现扩展细节。使得使用方的模块或类图尽可能少的更改
6.迪米特法则: 对象之间保持最少的了解,类之间耦合度尽可能的低,又称最少知道原则。耦合方式有:组合、聚合、依赖、关联,核心是降低类之间的耦合关系
7.合成复用原则: 尽量使用合成或者聚合的方式,避免使用继承
常见的单例模式的设计:
A.饿汉式(直接先创建对象,没有懒加载,会造成空间浪费)
//第一种类型--静态变量
class Singleton{
//1.构造器私有化,外部能new
private Singleton() {
}
//2.本类内部创建对象实例
private final static Singleton instance=new Singleton();
//3.提供一个共有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
//第二种类型--静态代码块
class Singleton2{
//1.构造器私有化,外部能new
private Singleton2() {
}
//2.本类内部定义静态成员变量,在静态代码块中创建对象
private static Singleton2 instance;
//在静态代码快中创建对象
static {
instance=new Singleton2();
}
//3.提供一个共有的静态方法,返回实例对象
public static Singleton2 getInstance() {
return instance;
}
}
B.懒汉式(使用时创建对象,一般存在效率过低或者线程不安全的情况,不推荐使用)
//第一种类型--线程不安全
class Singleton3{
private static Singleton3 instance;
//1.构造器私有化,外部能new
private Singleton3() {}
//提供一个静态的公有方法,当使用到该方法时,才创建instance对象
public static Singleton3 getInstance() {
if(instance==null) {//多个线程同时访问可能会创建多个对象,实际中不适用
instance=new Singleton3();
}
return instance;
}
}
//第二种类型--线程安全同步方法(效率低)
class Singleton4{
private static Singleton4 instance;
//1.构造器私有化,外部能new
private Singleton4() {}
//提供一个静态的公有方法,当使用到该方法时,才创建instance对象
public static synchronized Singleton4 getInstance() {//使用synchronized关键字保证线程同步
if(instance==null) {
instance=new Singleton4();
}
return instance;
}
}
C.双重检查(Double-Check在静态公共方法中使用两次的判空操作检查)
class Singleton5{
private static volatile Singleton5 instance;
//1.构造器私有化,外部能new
private Singleton5() {}
//双重检查方法,提供静态的公有方法,加入双重检查代码,解决线层安全问题,同时解决懒加载问题
public static Singleton5 getInstance() {
if(instance==null) {
synchronized (Singleton5.class) {
if(instance==null) instance = new Singleton5();
}
}
return instance;
}
}
D.静态内部类
静态内部类的特点:
单例模式使用了加载外部类成员时,没有使用静态内部类的成员或方法是,静态内部类不会加载,因此可以起到懒加载的目的;使用fina关键字修饰静态内部类的成员变量可以保证线程安全。
class Singleton6{
//私有化构造器
private Singleton6() {}
//静态内部类,有一个静态属性Singleton6,静态内部类在加载原来的类时不会加载,因此可是实现懒加载
private static class SingletonInstance{
private static final Singleton6 INSTANCE = new Singleton6();
}
//提供静态公有方法,获取对象
public static Singleton6 getInstance() {
return SingletonInstance.INSTANCE;
}
}
E.枚举
enum Singleton7{
INSTANCE;//属性
public void sayOk() {
System.out.println("ok");
}
}