设计模式
1.单例设计模式(重点):
单例设计指的是一个类只允许产生一个实例化对象。
1.1饿汉式单例模式
特点:构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象
补充:饿汉式是线程安全的。
代码:
public class TestSingleton{
public static void main(String[] args){
Singleton singleton = null;//声明对象
singleton = Singleton.getInstance();
singleton.print();
}
}
//饿汉式单例模式
class Singleton{
//在类的内部可以访问私有属性,所以在类的内部实例化
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}//private声明构造
public static Singleton getInstance(){
return INSTANCE;
}
public void print(){
System.out.println("Hello world!");
}
}
1.2懒汉式单例模式
特点:当第一次去使用对象的时候才会为其产生实例化对象。
补充:懒汉式存在线程安全问题,当多个线程同时访问时,可能创建的不止一个对象,并且要给instance上加上volatile关键字,来保证对象的可见性,否则可能会导致获取到的对象只初始化了一半(这是因为JVM优化代码时可能会做指令重排),优化在代码中体现。
代码:
public class TestSingleton{
public static void main(String[] args){
Singleton singleton = null;//声明对象
singleton = Singleton.getInstance();
singleton.print();
}
}
//懒汉式单例模式
class Singleton{
private int age;
private String name;
private static volatile Singleton instance;//优化:volatile保证instance的可见性
private Singleton(){//private声明构造
age = 10;
name = "小明";
}
public static Singleton getInstance(){
//优化:双重加锁,保证线程安全
if(instance == null){
synchronized (Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
public void print(){
System.out.println("Hello world!");
}
}
注意:懒汉式存在多线程安全问题(优化保证线程安全在代码中体现),而饿汉式不会。
2.多例设计模式
可以产生指定多个的实例化对象。
代码:
class Sex{
private String title;
public static final int MALE_FLAG = 1;
public static final int FEMALE_FLAG = 2;
private static final Sex MALE = new Sex("男");
private static final Sex FEMALE = new Sex("女");
private Sex(String title){
this.title = title;
}
public static Sex getInstance(int flag){
switch(flag){
case MALE_FLAG:
return MALE;
case FEMALE_FLAG:
return FEMALE;
default:
return null;
}
}
public String toString(){
return title;
}
}
public class TestMultiton {
public static void main(String[] args){
Sex male = Sex.getInstance(Sex.MALE_FLAG);
System.out.println(male);
}
}
注:多例和单例的共同特点:
(1) 构造方法私有化。
(2)类内部一定会提供一个static方法用于取得实例化对象。