java单例基类_单例模式基类泛型
在我们刚学设计模式的时候,单例模式可能是设计模式中最简单最容理解的吧。今天我们就来探究他不⼀样的风格,不⼀样的单例模式
⾸先,我们来看⼀下通俗的单例模式的设计
public classPerson
{
//这⾥必须要写私有构造函数
privatePerson() { }
public string Name { get; set; }
public string Age { get; set; }
private static object obj = new object();
private staticPerson _person;
//单例属性
public staticPerson Instance
{
get{
if (_person == null)
{
lock(obj)单例模式的几种实现方式
{
if (_person == null)
{
_person = newPerson();
}
}
}
return_person;
}
}
}
这种单例模式虽然正确的,但是要注意⼏个问题,
第⼀ 构造函数必须是私有构造函数
第⼆ 必须加上锁,才能保证唯⼀实例
如果说到这⾥就完了,那我没有必要写这篇⽂章,因为你⼀百度就会有⼀⼤把。我会有什么不⼀样的
风格,那我们还要学习⼀个知识点,那是在⼀篇⽂章中⽆意看到的(Lazy),他是⼀个按需加载的泛型类。
下⾯验证他是否是按需加载的类
1 Lazy la = new Lazy();
2 Console.WriteLine(la.IsValueCreated); //实体是否被创建
3 Console.WriteLine(la.Value.Name);
4 Console.WriteLine(la.IsValueCreated);
5 classPerson1
6 {
7 public string Name { get { return "啄⽊鸟"; } }
8 }
得出结果
从上⾯的结果看来,他确实是按需加载, 那按需加载他有什么好处,好处在于他能在 需要他的时候实例,防⽌系统刚启动时慢,等原因,要解决单例模式,必须要在多线程内唯⼀,Lazy 解决了线程 内的唯⼀(他的详细内容 请百度,因为他在这篇⽂章中不是重点)
有了这些知识点有没有想把他封装成⼀个基类 ,只要继承他就实现了单例模式,这就是我说的不⼀样的风格
public abstract class Singleton where TEntity:class{
private static readonly Lazy m_Instance = new Lazy(() =>{
var ctors = typeof(TEntity).GetConstructors(
BindingFlags.Instance
|BindingFlags.NonPublic
|BindingFlags.Public);
if (ctors.Count() != 1)
{
throw new InvalidOperationException(String.Format("类 {0} 必须包含⼀个构造函数", typeof(TEntity)));
}
var ctor = ctors.SingleOrDefault(c=>c.GetParameters().Count()==0&&c.IsPrivate);
if (ctor == null)
{
throw new InvalidOperationException(String.Format("构造函数{0}必须是⽆参数并且私有的", typeof(TEntity)));
}
return (TEntity)ctor.Invoke(null);
});
public staticTEntity Instance
{
get { returnm_Instance.Value; }
}
}
继承单例内代码
public class Person : Singleton{
privatePerson() { }
public string Name { get; set; }
public string Age { get; set; }
}
调⽤⽅式
Console.WriteLine(Person.Instance.Name);
结果:
这样是不是简单多了,如果有什么不懂的地⽅ QQ:209229923
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论