构造方法私有化(单例和多例设计的初步了解

首先,来看一下下面的这段代码

 

私有化构造方法

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);
	}
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值