一、引言
本期该给大家讲设计模型,设计模型在程序中运用非常的广泛,你不经意写的方法,调的接口,可以就是一种简单的设计模型,设计模型是程序开发中针对特定问题的解决方案总结。
二、设计模型
设计模型主要分为:创建型设计模式、结构型设计模式与行为型设计模式。
其实这几个模型都离不开我们之前讲的对象的六大原则。
三、单例模式
好了,废话不多说,开始讲第一个,创建型设计模式中的单例模式。
在讲之前给大家讲一下什么是创建型设计模式,听这个名字我们就知道是创建某个东西而设计的,这里我们研究的是对象的创建,就是用来解决对象实例化和使用的客户端耦合的模式,可以让客户端和对象实例化都独立变化,做到相互不影响。
创建模式包括:
【1.1】简单工厂:解决了单一对象的创建问题。
【1.2】抽象工厂:解决了多组对象的创建问题。
【1.3】单利模式:对象使用中始终保持唯一。
四、案例
简单工厂与抽象工厂我们先不讲,接下来我们看单例模式,废话不多说直接上代码:
1.我们首先看没有用到单例模式的案例
class Program
{
static void Main(string[] args)
{
TestClass test1 = new TestClass();
test1.TestMethod();
TestClass test2 = new TestClass();
test2.TestMethod();
Console.Read();
}
}
public class TestClass
{
/// <summary>
/// 构造方法
/// </summary>
public TestClass()
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " TestClass()构造方法开始执行时间");
//需要访问其他资源。。。会耗费时间。。。
System.Threading.Thread.Sleep(2000);
}
public void TestMethod()
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " TestMethod()方法执行时间");
}
}
我们简单的看一下运行出来的效果两个同时调用时就会调用2次构造方法,会给程序带来负担
2.我们接下来看使用了单利模式的例子
class Program
{
static void Main(string[] args)
{
TestClass test1 = TestClass.GetInstance();
test1.TestMethod();
TestClass test2 = TestClass.GetInstance();
test2.TestMethod();
Console.Read();
}
}
public class TestClass
{
//【1】创建一个私有的静态成员变量,用来保存当前的实例
private static TestClass instance;
/// <summary>
/// 【2】私有化构造方法:避免外界直接new这个类的实例
/// </summary>
private TestClass()
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " TestClass()构造方法开始执行时间");
//需要访问其他资源。。。会耗费时间。。。
System.Threading.Thread.Sleep(2000);
}
//【3】创建一个让外界能够获取到的实例方法
public static TestClass GetInstance()
{
if (instance == null)
{
instance = new TestClass();
}
return instance;
}
我们给定了一个约束,创建了一个私有制的静态变量,并对方法直接判断避免了多次进入这个实例,我们接下来看看运行出来的效果:
由此可以单例模式避免了同时NEW了几个对象执行了实例,保证了只有一个实例,而不会被重复创建
3.接下来我们加上多线程试一试:
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() =>
{
var test1 = TestClass.GetInstance();
test1.TestMethod();
});
Task.Factory.StartNew(() =>
{
var test2 = TestClass.GetInstance();
test2.TestMethod();
});
Console.Read();
}
}
public class TestClass
{
//【1】创建一个私有的静态成员变量,用来保存当前的实例
private static TestClass instance;
/// <summary>
/// 【2】私有化构造方法:避免外界直接new这个类的实例
/// </summary>
private TestClass()
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " TestClass()构造方法开始执行时间");
//需要访问其他资源。。。会耗费时间。。。
System.Threading.Thread.Sleep(2000);
}
//【4】创建一个静态只读的辅助对象(就是为了lock使用)
private static readonly object helperObject = new object();
//【3】创建一个让外界能够获取到的实例方法
public static TestClass GetInstance()
{
if (instance == null)
{
lock (helperObject)
{
if (instance == null)
{
instance = new TestClass();
}
}
}
return instance;
}
public void TestMethod()
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " TestMethod()方法执行时间");
}
}
首先我们先New2个线程方法,然后我们在下面的方法里面加了个双重绑定,完全的杜绝了
五、结尾
【每天进步一点】会一直陪着大家一起进步,共同学习,希望大家早日成为大佬!!
后面讲C#设计模式(二)简单工厂~
欢迎大家留言,我有什么错误都可以指出来,一起学习。。