일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- w3school
- github
- parameter
- DP
- loop
- 기초
- UE5
- dfs
- W3Schools
- String
- 문제풀이
- C#
- Class
- Programming
- Unreal Engine 5
- Material
- dynamic
- guide
- 프로그래밍
- 시작해요 언리얼 2022
- 재귀
- Algorithm
- Tutorial
- Unity
- 백준
- 파이썬
- c++
- Basic
- python
- 오류
- Today
- Total
행복한 개구리
C# 21.03.25.수업내용 본문
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;
}
}
'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 |