设计模式2 Singleton单件(创建型模式)包括静态函数和私有函数的详解
2012-07-31 10:05
253 查看
从目的来看:
– 创建型(Creational)模式:负责对象创建。
– 结构型(Structural)模式:处理类与对象间的组合。
– 行为型(Behavioral )模式:类与对象交互中的职责分配。
从范围来看:
– 类模式处理类与子类的静态关系。
– 对象模式处理对象间的动态关系。
意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点。
实例:
volatile多用于多线程的环境,当一个变量定义为volatile时,读取这个变量的值时候每次都是从momery里面读取而不是从cache读。这样做是为了保证读取该变量的信息都是最新的,而无论其他线程如何更新这个变量。
2.私有构造函数
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。
如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。
public
class Test
{
private Test()
{
Console.WriteLine("I am Test");
}
}
public
class ProgramTest
{
int j;
private ProgramTest()
{
j =
3;
Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);
}
static
void Main(string[] args)
{
Test t =
new Test();
ProgramTest pt1 =
new ProgramTest();
Console.Read();
}
}
结果:这时你会发现编译器会提示你,你无法创建Test的实例
(即使你在Test类中添加一个静态成员,结果依然会提示因为该构造函数受其保护级别的限制而不可访问)
若是只在自己类里有私有类呢?
public
class ProgramTest
{
int j;
private ProgramTest()
{
j =
3;
Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);
}
static
void Main(string[] args)
{
ProgramTest pt1 =
new ProgramTest();
Console.Read();
}
}
结果:I am ProgranmTest 默认构造函数,j=3
注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用private修饰符来清楚地表明该类不能被实例化。
若是一个类中既有实例构造函数又有私有构造函数,那么当实例对象是会怎么执行呢?
public
class Test
{
int i;
private Test()
{
i =
1;
Console.WriteLine("I am Test 默认构造函数 i={0}", i);
}
public Test(int i)
{
Console.WriteLine("I am Test 有参构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t =
new Test();
//编译器提示:因为该构造函数受其保护级别的限制而不可访问
Console.Read();
若是只执行有参构造函数呢?
public
class Test
{
int i;
private Test()
{
i =
1;
Console.WriteLine("I am Test 默认构造函数 i={0}", i);
}
public Test(int i)
{
Console.WriteLine("I am Test 有参构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t =
new Test(2);
Console.Read();
}
}
结果:I am Test 有参构造函数 i=2
3.静态构造函数
静态构造函数用来初始化静态变量,这个构造函数是属于类的,而不是属于哪个实例的。
就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 默认构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test();
Console.Read();
}
}
结果为:I am Test 默认构造函数 i=1
静态函数的特点:
1.静态构造函数既没有访问修饰符,也没有参数。
2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类,也就是无法直接调用静态函数,也无法控制什么时候执行静态函数。
3.一个类只能有一个静态构造函数,最多只能运行一次。
4.静态函数不可以被继承。
5.如果没有静态函数,而类中的静态成员有初始值,那么编译器会自动生成默认的静态构造函数。
如果静态默认构造函数和公有默认构造函数同时存在,会怎么样呢?
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
}
public Test()
{
Console.WriteLine("I am Test 公有默认构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test();
Console.Read();
}
}
结果:I am Test 静态默认构造函数 i=1
I am Test 公有默认构造函数 i=1
如果静态默认构造函数和公有有参构造函数同时存在,我实例化类让它调用静态默认构造函数会怎么样呢?
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
}
public Test(int j)
{
Console.WriteLine("I am Test 公有有参构造函数 i={0}", j);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test();
//系统会提示错误
Console.Read();
}
}
如果静态默认构造函数和公有有参构造函数同时存在,我实例化类让它调用公有构造函数会怎么样呢?
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
}
public Test(int j)
{
Console.WriteLine("I am Test 公有有参构造函数 i={0}", j);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test(2);
Console.Read();
}
}
结果:I am Test 静态默认构造函数 i=1
I am Test 公有有参构造函数 j=2
– 创建型(Creational)模式:负责对象创建。
– 结构型(Structural)模式:处理类与对象间的组合。
– 行为型(Behavioral )模式:类与对象交互中的职责分配。
从范围来看:
– 类模式处理类与子类的静态关系。
– 对象模式处理对象间的动态关系。
意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点。
实例:
volatile多用于多线程的环境,当一个变量定义为volatile时,读取这个变量的值时候每次都是从momery里面读取而不是从cache读。这样做是为了保证读取该变量的信息都是最新的,而无论其他线程如何更新这个变量。
2.私有构造函数
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。
如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。
public
class Test
{
private Test()
{
Console.WriteLine("I am Test");
}
}
public
class ProgramTest
{
int j;
private ProgramTest()
{
j =
3;
Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);
}
static
void Main(string[] args)
{
Test t =
new Test();
ProgramTest pt1 =
new ProgramTest();
Console.Read();
}
}
结果:这时你会发现编译器会提示你,你无法创建Test的实例
(即使你在Test类中添加一个静态成员,结果依然会提示因为该构造函数受其保护级别的限制而不可访问)
若是只在自己类里有私有类呢?
public
class ProgramTest
{
int j;
private ProgramTest()
{
j =
3;
Console.WriteLine("I am ProgramTest 默认构造函数,j={0}", j);
}
static
void Main(string[] args)
{
ProgramTest pt1 =
new ProgramTest();
Console.Read();
}
}
结果:I am ProgranmTest 默认构造函数,j=3
注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用private修饰符来清楚地表明该类不能被实例化。
若是一个类中既有实例构造函数又有私有构造函数,那么当实例对象是会怎么执行呢?
public
class Test
{
int i;
private Test()
{
i =
1;
Console.WriteLine("I am Test 默认构造函数 i={0}", i);
}
public Test(int i)
{
Console.WriteLine("I am Test 有参构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t =
new Test();
//编译器提示:因为该构造函数受其保护级别的限制而不可访问
Console.Read();
若是只执行有参构造函数呢?
public
class Test
{
int i;
private Test()
{
i =
1;
Console.WriteLine("I am Test 默认构造函数 i={0}", i);
}
public Test(int i)
{
Console.WriteLine("I am Test 有参构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t =
new Test(2);
Console.Read();
}
}
结果:I am Test 有参构造函数 i=2
3.静态构造函数
静态构造函数用来初始化静态变量,这个构造函数是属于类的,而不是属于哪个实例的。
就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 默认构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test();
Console.Read();
}
}
结果为:I am Test 默认构造函数 i=1
静态函数的特点:
1.静态构造函数既没有访问修饰符,也没有参数。
2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类,也就是无法直接调用静态函数,也无法控制什么时候执行静态函数。
3.一个类只能有一个静态构造函数,最多只能运行一次。
4.静态函数不可以被继承。
5.如果没有静态函数,而类中的静态成员有初始值,那么编译器会自动生成默认的静态构造函数。
如果静态默认构造函数和公有默认构造函数同时存在,会怎么样呢?
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
}
public Test()
{
Console.WriteLine("I am Test 公有默认构造函数 i={0}", i);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test();
Console.Read();
}
}
结果:I am Test 静态默认构造函数 i=1
I am Test 公有默认构造函数 i=1
如果静态默认构造函数和公有有参构造函数同时存在,我实例化类让它调用静态默认构造函数会怎么样呢?
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
}
public Test(int j)
{
Console.WriteLine("I am Test 公有有参构造函数 i={0}", j);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test();
//系统会提示错误
Console.Read();
}
}
如果静态默认构造函数和公有有参构造函数同时存在,我实例化类让它调用公有构造函数会怎么样呢?
public
class Test
{
static
int i;
static Test()
{
i =
1;
Console.WriteLine("I am Test 静态默认构造函数 i={0}", i);
}
public Test(int j)
{
Console.WriteLine("I am Test 公有有参构造函数 i={0}", j);
}
}
public
class ProgramTest
{
static
void Main(string[] args)
{
Test t1 =
new Test(2);
Console.Read();
}
}
结果:I am Test 静态默认构造函数 i=1
I am Test 公有有参构造函数 j=2
相关文章推荐
- Java开发中的23种设计模式详解之一:5种创建型模式
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- 设计模式-02-创建型模式详解
- 走穿23种设计模式-前五种,创建型模式详解
- 详解java设计模式(一)之单例模式(创建型)
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- 设计模式之五大创建型模式(附实例和详解)
- (转)Java经典设计模式(1):五大创建型模式(附实例和详解)
- 详解java设计模式(二)之工厂模式上篇(创建型)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java开发中的23种设计模式详解(1)创建型
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)