Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

행복한 개구리

C# 21.03.25.수업내용 본문

C#/수업내용

C# 21.03.25.수업내용

HappyFrog 2021. 3. 25. 11:24

Singleton패턴

카테고리 : 생성패턴(Creational Pattern)

개요 : Singleton 디자인 패턴은 하나의 클래스가 단지 하나의 인스턴스만 갖도록 제한하고 전역 범위에서 그 인스턴스를 액세스할 수 있게 하는 패턴이다. 이 패턴은 시스템 전체에 걸쳐 하나의 인스턴스가 모든 처리에 조율해야 하는 곳에 유용하다.

 

Singleton 디자인 패턴은 클래스가 하나의 인스턴스만을 갖도록 하고, 그 인스턴스를 시스템 전역에서 엑세스할 수 있도록 하는 패턴이다. 클래스의 생성자를 private으로 만들고, 클래스 안에서 이 private 생성자를 호출해 하나의 인스턴스만 생성하는 방법을 사용한다.

 

Client 클래스는 Singleton 인스턴스를 얻은 후, Singleton 클래스의 멤버들(메서드/ 속성 등)을 엑세스하게 된다. 일반적으로 Singleton 인스턴스는 클라이언트가 처음 Singleton인스턴스를 엑세스할 때 생성되어 이후 프로그램이 종료될 때까지 동일한 인스턴스를 사용하게 된다.(Singleton 인스턴스는 Healp메모리에 할당됨)

 

Singleton 패턴 구현

1. 생성자를 private으로.(다른 외부 클래스가 사용할 수 없도록)

2. public static readonly Sinleton Instance = new Singleton();

ㄴ static이라서 형식으로 접근, readonly.

 

 

============================================================================

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;

namespace Study004
{
    class App
    {        
        public App()
        {
            Console.WriteLine("App");

            DataManager.GetInstance().LoadQuestData("./quest_data.json");
            DataManager.GetInstance().LoadMonsterData("./monster_data.json");
            DataManager.GetInstance().LoadRewardData("./reward_data.json");

            QuestData quest1 = DataManager.GetInstance().dicQuestDatas[601];            
            QuestData quest2 = DataManager.GetInstance().dicQuestDatas[602];

            Console.WriteLine("======================================================");

            //퀘스트 이름 ||  진행/목표

            //버튼 생성
            Button btn = new Button();

            //이벤트 등록
            btn.onClick += (sender, args) =>
            {
                PrintQuestDetails(quest1);
                Console.WriteLine("======================================================");
                PrintQuestDetails(quest2);
            };

            //5초후
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine("Loading {0}sec...", i+1);
                Thread.Sleep(1000);
            }
            btn.Click();
        }     

        private void PrintQuestDetails(QuestData questData)
        {
            Console.WriteLine("***** 목표 *****");
            string goalDesc = string.Format(questData.goal_desc, questData.goal_count);
            Console.WriteLine(goalDesc);

            Console.WriteLine("***** 내용 *****");
            Console.WriteLine(questData.desc);
                        
            Console.WriteLine("***** 보상 *****");
            RewardData reward1 = DataManager.GetInstance().GetRewardType(questData.reward_type_id1);
            RewardData reward1_2 = DataManager.GetInstance().GetRewardType(questData.reward_type_id2);
            Console.WriteLine("{0}:{1}, {2}:{3}", reward1.name, questData.reward_amount1, reward1_2.name, questData.reward_amount2);
            

        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;


namespace Study004
{
    public class DataManager
    {
        private static DataManager instance;
        public Dictionary<int, QuestData> dicQuestDatas;
        public Dictionary<int, MonsterData> dicMonsterDatas;
        public Dictionary<int, RewardData> dicRewardDatas;
        
        //생성자 
        private DataManager()
        {

        }

        public static DataManager GetInstance()
        {
            if (DataManager.instance == null)
                DataManager.instance = new DataManager();
            return DataManager.instance;
        }

        public void LoadQuestData(string path)
        {
            string json = File.ReadAllText(path);
            QuestData[] arrQuestDatas = JsonConvert.DeserializeObject<QuestData[]>(json);
            dicQuestDatas = arrQuestDatas.ToDictionary(x => x.id);
            Console.WriteLine(dicQuestDatas.Count);
        }

        public void LoadMonsterData(string path)
        {
            string json = File.ReadAllText(path);
            MonsterData[] arrMonsterDatas = JsonConvert.DeserializeObject<MonsterData[]>(json);
            dicMonsterDatas = arrMonsterDatas.ToDictionary(x => x.id);
            Console.WriteLine(dicMonsterDatas.Count);
        }

        public void LoadRewardData(string path)
        {
            string json = File.ReadAllText(path);
            RewardData[] arrRewardDatas = JsonConvert.DeserializeObject<RewardData[]>(json);
            dicRewardDatas = arrRewardDatas.ToDictionary(x => x.id);
            Console.WriteLine(dicRewardDatas.Count);
        }

        public RewardData GetRewardType(int typeId)
        {
            return this.dicRewardDatas[typeId];
        }        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study004
{
    public class RewardData
    {
        public int id;
        public string name;
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study004
{
    class Button
    {
        public event EventHandler onClick;

        public Button()
        {

        }
        public void Click()
        {
            onClick(this, EventArgs.Empty);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study004
{
    public class QuestData
    {
        public int id;
        public string name;
        public int monster_id;
        public int goal_count;
        public string goal_desc;
        public string desc;
        public int reward_type_id1;
        public int reward_type_id2;
        public string reward_amount1;
        public string reward_amount2;
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study004
{
    public class MonsterData
    {
        public int id;
        public string name;
    }
}

3초로 변경했다. Enum타입을 안쓴게 아쉽긴 하지만 일단은 완성했다.

 

'C# > 수업내용' 카테고리의 다른 글

C# 21.03.29.수업내용  (0) 2021.03.29
C# 21.03.26.수업내용  (0) 2021.03.26
C# 21.03.24.수업내용  (0) 2021.03.24
C# 21.03.23.수업내용  (0) 2021.03.23
C# 21.03.22.수업내용  (0) 2021.03.22