面向对象(下)-设计模式与单例设计模式
设计模式是在大量的实践中总结和理论化之后优先的代码结构、编码风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和探索。总结就是"套路"。
所谓的类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法。如果我们要让类在虚拟机中只产生一个对象,我们首先必须将类得构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,只能调用改类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该对象的变量也必须定义成静态的。
面向对象(下)单例的饿汉式实现
java
public class SingletonTest {
public static void main(String[] args) {
// Bank bank = new Bank(); // 编译报错 'Bank()' has private access in '.Bank'
Bank bank1 = Bank.getInstance(); // 饿汉式单例!
Bank bank2 = Bank.getInstance(); // 饿汉式单例!
System.out.println(bank2 == bank1); // true
}
}
class Bank{
// 1. 私有化类的构造器
private Bank() {
System.out.println("饿汉式单例!");
}
// 2. 内部创建类的对象(需要是static)
private static Bank instance = new Bank();
// 3. 提供公共的静态的方法,返回类的对象
public static Bank getInstance() {
return instance;
}
}
注意以下方式造对象,不属于单例,不能为了省事将new Bank()直接返回,如果这么做,每次getInstance都会创建一个对象:
java
public class SingletonTest {
public static void main(String[] args) {
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
System.out.println(bank2 == bank1); // false,两次对象不一样,不是单例
}
}
class Bank{
// 1. 私有化类的构造器
private Bank() {
System.out.println("不是单例模式!");
}
// 2. 提供公共的静态的方法,返回类的对象
public static Bank getInstance() {
return new Bank(); // 每次都会造对象
}
}
面向对象(下)单例的懒汉式
java
public class SingletonTest {
public static void main(String[] args) {
Order order1 = Order.getInstance(); // 懒汉式单例!
Order order2 = Order.getInstance(); // 不打印
System.out.println(order2 == order1); // true
}
}
class Order{
// 1. 私有化类的构造器
private Order() {
System.out.println("懒汉式单例!");
}
// 2. 声明当前类的对象,没有初始化
private static Order instance = null;
// 3. 提供公共的静态的方法,返回类的对象
public static Order getInstance() {
if (instance == null) {
instance = new Order();
}
return instance;
}
}