首先,来看一下下面的这段代码
私有化构造方法
class Singleton { // 定义一个类
private Singleton() { // 构造方法私有化
}
public void print() {
System.out.println("Hello World .");
}
}
public class TestDemo {
public static void main(String args[]) {
Singleton inst = null; // 声明对象
inst = new Singleton(); // 错误:The constructor Singleton() is not visible
inst.print(); // 调用方法
}
}
Ø 现在发现在实例化Singleton类对象的时候,程序出现了编译错误,因为构造方法被私有化了,无法在外部调用,即:无法在外部实例化Singleton类的对象。
Ø 现在就需要思考:在保证Singleton类之中的构造方法不修改不增加,以及print()方法不修改的情况下,如何操作,才可以让类的外部通过实例化对象再去调用print()方法?
一:使用private访问权限定义的操作只能被本类所访问,外部无法调用,那么现在既然构造方法被私有化了,就证明,这个类的构造方法只能被本类所调用,即:只能够在本类之中产生本类实例化对象。
class Singleton { // 定义一个类
Singleton instance = new Singleton() ; // 在内部实例化本类对象
private Singleton() { // 构造方法私有化
}
public void print() {
System.out.println("Hello World .");
}
}
二:对于一个类之中的普通属性,默认情况下一定要在本类存在了实例化对象之后才可以进行调用,可是现在在Singleton类的外部无法产生实例化对象,那么必须想一个办法,让Singleton类中的instance属性可以在没有Singleton类实例化对象的时候来进行调用,可以使用static完成,static定义的属性特点:由类名称直接调用,并且在没有实例化对象的时候也可以调用。
class Singleton { // 定义一个类
static Singleton instance = new Singleton() ; // 可以由类名称直接访问
private Singleton() { // 构造方法私有化
}
public void print() {
System.out.println("Hello World .");
}
}
public class TestDemo {
public static void main(String args[]) {
Singleton inst = null; // 声明对象
inst = Singleton.instance; // 利用“类.static属性”方式取得实例化对象
inst.print(); // 调用方法
}
}
三:类之中的全部属性都应该封装,所以以上的instance属性应该进行封装,而封装之后要想取得属性要编写getter方法,只不过这个时候的getter方法应该也由类名称直接调用,定义为static型。
class Singleton { // 定义一个类
private static Singleton instance = new Singleton() ;
private Singleton() { // 构造方法私有化
}
public void print() {
System.out.println("Hello World .");
}
public static Singleton getInstance() { // 取得本类对象
return instance;
}
}
public class TestDemo {
public static void main(String args[]) {
Singleton inst = null; // 声明对象
inst = Singleton.getInstance(); // 利用“类.static方法()”取得实例化对象
inst.print(); // 调用方法
}
}
多例设计
Ø 单例设计模式只留有一个类的一个实例化对象,而多例设计模式,会定义出多个对象,例如:定义一个表示星期的操作类类,这个类的对象只能有7个实例化对象(星期一 ~ 星期日)。而定义一个表示性别的类,只能有2个实例化对象(男、女),定义一个表示颜色基色的操作类,只能有3个实例化对象(红、绿、蓝),这种情况下,这样的类就不应该由用户无限制的去创造实例化对象,应该只使用有限的几个,这个就属于多例设计,但不管是单例设计还是多例设计,有一个核心不可动摇—— 构造方法私有化。
定义一个表示性别的类class Sex {
private String title;
private static final Sex MALE = new Sex("男");
private static final Sex FEMALE = new Sex("女");
private Sex(String title) { // 构造私有化了
this.title = title;
}
public String toString() {
return this.title;
}
public static Sex getInstance(int ch) { // 返回实例化对象
switch (ch) {
case 1: return MALE;
case 2: return FEMALE;
default: return null;
}
}
}
public class TestDemo {
public static void main(String args[]) {
Sex sex = Sex.getInstance(2);
System.out.println(sex);
}
}
class Sex {
private String title;
private static final Sex MALE = new Sex("男");
private static final Sex FEMALE = new Sex("女");
private Sex(String title) { // 构造私有化了
this.title = title;
}
public String toString() { return this.title;}
public static Sex getInstance(String ch) {
switch (ch) { // 利用字符串判断
case "man“: return MALE;
case "woman“: return FEMALE;
default: return null;
}
}
}
public class TestDemo {
public static void main(String args[]) {
Sex sex = Sex.getInstance("man");
System.out.println(sex);
}
}