单例设计模式:
就是指一个类只允许产生一个实例化对象。
分析:
要想只能产生一个实例化对象,就意味着使用者不能在外部使用 new 生成一个实例,即表示该类的构造函数是私有的(貌似C++当中没有私有的构造函数),私有的构造函数只能在类内部执行才能实例化一个对象,意味着类内部一定会有一个静态的方法,来实例化一个自己的实例。
两者的共同特点是:构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象。
饿汉式单例设计模式:
class Message{
private String note;
private static final Message MESSAGE= new Message(); //静态的代码语句在类的内部实现一个实例化
private Message(){} // 私有的构造函数
public String getNote() { return note; }
public void setNote(String note) { this.note = note; }
public static Message getMessage(){
return MESSAGE;
}
}
public class Main {
public staticvoid main(String[] args) {
Message s = null;
s = Message.getMessage();
System.out.println(s);
}
}
特点:
在类加载的时候在内部实例化一个自己的对象。
懒汉式单例设计模式:
class Message{
private String note;
private static Message message;
private Message(){} // 私有的构造函数
public String getNote() { return note; }
public void setNote(String note) { this.note = note; }
public static Message getMessage(){
if (message == null){ // 表示第一次使用
message = new Message();
}
return message;
}
}
public class Main {
public staticvoid main(String[] args) {
Message s = null;
s = Message.getMessage();
System.out.println(s);
}
}
特点:
只有在第一次使用的时候才会为其实例化一个实例的操作。
多例设计模式:
类的实例化对象被限制为固定的几个。与多例设计模式大致相同,都是构造方法私有化,通过静态的方法获得对象。(该概念已经被枚举所取代了)
样例一:
class Sex{
public staticfinal int MALE_CMD = 1;
public static final int FEMALE_CMD = 2;
private static final Sex MALE = new Sex("男");
private static final Sex FEMALE = new Sex("女");
private String sex;
private Sex(String _sex){ // 构造方法私有化
this.sex = _sex;
}
public static Sex getSex(int ch){
switch (ch){
case MALE_CMD:
return MALE;
case FEMALE_CMD:
return FEMALE;
default:
return null;
}
}
@Override
public String toString(){
return this.sex;
}
}
public class Main {
public staticvoid main(String[] args) {
Sex a = Sex.getSex(Sex.MALE_CMD);
System.out.println(a.toString());
}
}
样例二:
class Admin{
private static final Integer MAX_ADMIN_COUNT = 3; // 管理员最多只能有三个
private static Integer ADMIN_COUNT = 0; // 当前已有管理员个数
private String name;
private Integer age;
public static Admin getAdmin(){
if (ADMIN_COUNT < MAX_ADMIN_COUNT){
ADMIN_COUNT++;
return new Admin();
}else {
return null;
}
}
public Integer getAge() { return age; }
public void setAge(Integer age) {this.age = age;}
public String getName() { return name;}
public void setName(String name) { this.name = name; }
}
public class Main {
public staticvoid main(String[] args) {
Admin admin_1 = Admin.getAdmin();
System.out.println(admin_1);
Admin admin_2 = Admin.getAdmin();
System.out.println(admin_2);
Admin admin_3 = Admin.getAdmin();
System.out.println(admin_3);
Admin admin_4 = Admin.getAdmin();
System.out.println(admin_4); // null
}
}
程序输出结果为: