当构造函数变成protected
来源:互联网 发布:vmware ubuntu 全屏 编辑:程序博客网 时间:2024/04/29 10:29
最近复习软考时发现一个有趣的现象。很多设计模式都没有对构造函数做过多的修改。但是单例模式是个意外。
下面来看看单例模式的代码
public class Singleton{ private static Singleton unique = null; private Singleton(){} public static synchronized Singleton getInstance(){ if(unique == null){ unique = new Singleton(); } }}
那么问题来了。
问题1:单例模式为什么要这么处理构造函数。
问题2:单例模式如何解决私有化构造函数的弊端
问题3:这样做的弊端是什么
首先来看第一个问题。单例模式将构造函数私有化,所以我们无法公开使用构造函数。也就是说像Singleton a = new Singleton()这样的写法是无法得到实例的。那么为什么要这么做呢。那是因为单例模式的定义是保证一个类仅有一个实例,并提供一个访问它的全局访问点。而一个类能够被创建多个实例,问题的根源在于类的构造方法是公开的,也就是可以让类的外部来通过构造方法来创建多个实例。因此需要把创建实例的权限尽可能地缩小,甚至取消。
现在来看看问题二。既然构造函数是创建类时使用的,那么取消了类的创建权限,我们该如何创建类呢?在单例模式中提供一个创建类的静态方法,来供大家创建时使用。这两种方法的差别在于构造方法无法处理静态变量而特供的方法则是静态的。更有意思的是,java中虽然没有静态构造函数的概念,c#中却是有的。
现在来看看问题三。这样的设计的优点在于能够控制对象的创建个数,缺点在于无法实法面向对象的重要概念:继承。基于解决这个问题有很多大神提出了用protected来替代private的写法。下面是protected的代码
public class ClassA{ protected ClassA() { }}public class ClassB extends ClassA{ public ClassB() { }}总结
突然有一种感觉,设计模式的结构看似简单,其中细节之处却蕴含了很深的道理,值得我们去深思。
0 0
- 当构造函数变成protected
- 当构造函数定义在private或者protected里时
- 构造函数 的protected
- java构造函数之private,protected
- 构造函数定义为private,protected
- 构造函数定义为private,protected
- 构造函数定义为private,protected
- java构造函数之private,protected
- java构造函数之private,protected
- 构造函数定义为private 或者protected
- 构造函数定义为private,protected
- 构造函数定义为private,protected
- 构造函数定义为private,protected
- 构造函数定义为private,protected
- 构造函数定义为private,protected
- 构造函数定义为private,protected
- C++构造函数public,protected,private
- 构造函数定义为private,protected
- JPA使用mysql的时候创建varchar型列使用utf8
- window+Apache 配置虚拟主机(2)
- 算法比赛
- App Store Review Guidlines
- apache和tomcat的区别以及weblogic
- 当构造函数变成protected
- C#反射 获取程序集信息和通过类名创建类实例
- (一)线程管理_5---等待线程终止
- 反复撒按时发放时萨芬撒飞洒发顺丰
- 【Android】网络框架Volley(终极篇)
- java学习第一天要点
- <Android>构建一个ListView基础版
- jquery中选择第n个孩子的选择器即nth-child选择器
- LightOJ 1269 - Consecutive Sum(字典树)