C#의 예제를 사용한 디자인 패턴

C# 예제가 있는 디자인 패턴 목록
[옵저버, 어댑터, 파사드, 싱글톤, 팩토리 방식, 브리지]

행동 패턴


관찰자



개체가 다른 개체에 상태 변경 사항을 알릴 수 있도록 합니다(게시자 및 구독자). 여기에서 사용할 수 있는 예제에 대한 자세한 정보https://docs.microsoft.com/en-us/dotnet/standard/events/observer-design-pattern


interface IObserver{
    void Update(object update);
}

interface ISubject{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify();
}

class Subject: ISubject{
    private List<IObserver> _subjectObservers;

    public Subject(){
        _subjectObservers = new List<IObserver>();
    }

    void Attach(IObserver observer){
        _subjectObservers.Add(observer);
    }

    void Detach(IObserver observer){
        _subjectObservers.Remove(observer);
    }

    void Notify(){
        foreach(var observer in _subjectObservers){
            observer.Update("Some state");
        }
    }

    /*
        Some logic that calls to Notify when needed
    */
}

class ObserverA: IObserver{
    void Update(object update){

    }
}

class ObserverB: IObserver{
    void Update(object update){

    }
}

class SomeClass{
    public void Init(){
        var observerA = new ObserverA();
        var observerB = new ObserverB();
        var subject = new Subject();
        subject.Attach(observerA);

    }
}




구조적 패턴



어댑터



호환되지 않는 인터페이스가 함께 작동하도록 허용


class ToAdapt{
    public int Calculate(int a, int b){
        return a * b;
    }
}

class IAdaptInterface{
     public void CalculateWithLessParameters(int a);
}

class Adapter: ToAdapt, IAdaptInterface{
    public int CalculateWithLessParameters(int a){
        return Calculate(a, 10);
    }
}



정면



복잡한 클래스, 라이브러리에 대한 단순화된 인터페이스 제공

public class MemoryCacheFacade
{
    private MemoryCache _memoryCache;

    public MemoryCacheFacade(MemoryCacheOptions memoryCacheOptions)
    {
        _memoryCache = new MemoryCache(memoryCacheOptions);
    }

    public void Set<TItem>(object key, TItem value)
    {
        _memoryCache.Set(key, value);
    }

    public bool TryGetValue<TItem>(object key, out TItem result)
    {
        if (_memoryCache.TryGetValue(key, out result)) 
        {
            return true;
        }

        return false;
    }

    public ICacheEntry CreateEntry(object key)
    {
            return _memoryCache.CreateEntry(key);
    }
}


다리



브리지 디자인 패턴은 추상화에서 구현을 분리합니다. 새 소프트웨어가 이전 소프트웨어를 대체하지만 기존 코드베이스에 대해 둘 다 함께 실행되어야 하는 경우 버전 관리에 유용합니다.


class Abstraction{
    Bridge _bridge;
    public Abstraction(Bridge bridge){
        _bridge = bridge;
    }

    public string Execute(){
        _bridge.ExecuteSomeFunction();
    }
}

interface IBridge{
    void ExecuteSomeFunction();
}

class Version1: IBridge{
    public void ExecuteSomeFunction(){

    }
}

class Version2: IBridge{
    public void ExecuteSomeFunction(){

    }
}

static void Main(){
    (new Abstraction(new Version1())).Execute();
    (new Abstraction(new Version2())).Execute();
}



창작 패턴



하나씩 일어나는 것



디자인 패턴은 해당 유형의 객체가 하나만 존재하고 해당 객체에 대한 액세스 포인트가 있음을 보장합니다.
  • 개인 생성자 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/private-constructors

  • 
    class Singleton{
    
        private static Singleton singeltonInstance=null;
    
        /*
            Private constructor here is to prevent creation of
            multiple instances of this class
        */
        private Singleton()  
        {  
        } 
    
        public static Singleton SingletonInstance{
            if(singeltonInstance == null){
                singeltonInstance = new Singleton();
            }
            return singeltonInstance;
        }
    
    }
    
    



    공장 방법



    구체적인 클래스를 지정하지 않고 개체를 만들기 위한 인터페이스를 제공합니다.

    interface IShip{
        string Name();
    }
    
    class BigShip: IShip{
        public string Name(){
            return "Big ship";
        }
    }
    
    class SmallShip: IShip{
        public string Name(){
             return "Small ship";
        }
    }
    
    class Creator{
        private bool _bigShipAvailable = true;
        public IShip FactoryMethod(){
            if(_bigShipAvailable){
                _bigShipAvailable  = false;
                return new BigShip();
            }else{
                return new SmallShip();
            }
        }
    }
    

    좋은 웹페이지 즐겨찾기