Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Но иногда некоторые объекты очень удобно делать синглтонами
Синглтон — это чудесное спасение :)
(используем самописный new вместо getInstance)
my $self;
sub new {
my $class = shift;
unless ($self) {
$self = $class->SUPER::new;
# some init code
}
return $self;
}public class Singleton<T> where T : class
{
private static T _instance;
private static T CreateInstance()
{
ConstructorInfo cInfo = typeof(T).GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[0],
new ParameterModifier[0]);
return (T)cInfo.Invoke(null);
}public class Singleton<T> where T : class, new()
{
private static T _instance;
protected Singleton()
{
}
private static T CreateInstance()
{
return new T();
}public class Session : Singleton<Session>
{
public Session()
{
}
public bool IsSessionExpired()
{
return false;
}
}
public class Singleton<T> where T : class
{
// ...
public static T Instance
{
get
{
if (_instance == null)
{
lock (_locker)
{
if (_instance == null)
{
_instance = CreateInstance();
}
}
}
return _instance;
}
}
}
public sealed class Session
{
private static readonly Lazy InstanceField = new Lazy(() => new Session());
private Session()
{
}
public static Session Instance
{
get
{
return InstanceField.Value;
}
}
// ...
}
Кода немного, ничего страшного, зато все безопасно и работает.class A:B {
B _b;
A() {
_b = new B();
}
getB() {
return _b;
}
...
}
class B {
void doSmth () {
...
}
...
}
A.getB().doSmth();
class A:B {
...
}
class B() {
void doSmth () {
...
}
...
}
A.doSmth();
Singleton (Одиночка) или статический класс?