Как сделать один класс ответственным за создание и предоставление доступа к другому классу? - PullRequest
2 голосов
/ 23 февраля 2010

Вот как я понимаю, я могу реализовать шаблон синглтона в C #:

public class ChesneyHawkes{
    private static ChesneyHawkes _instance = new ChesneyHawkes();
    public ChesneyHawkes Instance {get{return _instance;}}

    private ChesneyHawkes()
    {
    }

}

Что, если я хочу предоставить один экземпляр объекта, чтобы он мог быть только один, сделать доступ к нему общедоступным, но разрешить его создание или замену только другим синглтоном.

//   The PuppetMaster should be the only class that 
//   can create the only existing Puppet instance.

public class PuppetMaster{

    private static PuppetMaster_instance = new PuppetMaster();
    public static PuppetMaster Instance {get{return _instance;}}

    // Like a singleton but can be replaced at the whim of PuppetMaster.Instance
    public static Puppet PuppetInstance {get {return Puppet;}}

    private PuppetMaster()
    {

    }

    public class Puppet{
          // Please excuse the pseudo-access-modifier
          puppetmasteronly Puppet(){

          }
    }
}


//   To be accessed like so.
PuppetMaster.Puppet puppet = PuppetMaster.Instance.PuppetInstance;

1 Ответ

1 голос
/ 23 февраля 2010

Вам не нужно больше одного синглтона для этого. Посмотрите на этот пример:

using System;

// interface for the "inner singleton"
interface IPuppet {
    void DoSomething();
}

class MasterOfPuppets {

    // private class: only MasterOfPuppets can create
    private class PuppetImpl : IPuppet {
        public void DoSomething() {
        }
    }

    static MasterOfPuppets _instance = new MasterOfPuppets();

    public static MasterOfPuppets Instance {
        get { return _instance; }
    }

    // private set accessor: only MasterOfPuppets can replace instance
    public IPuppet Puppet {
        get;
        private set;
    }
}

class Program {
    public static void Main(params string[] args) {
        // access singleton and then inner instance
        MasterOfPuppets.Instance.Puppet.DoSomething();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...