0325 싱글턴 패턴
2021. 3. 25. 15:19ㆍC#/수업내용
디자인 패턴은 하나의 클래스가 단지 하나의 인스턴스만 갖도록 제한한다.
전역 범위에서 그 인스턴스를 엑세스할 수 있게 하는 패턴이다.
일반적으로 singleton 인스턴스는 클라이언트가 처음 singleton 인스턴스를 엑세스할 때 생성된다.
구현:
생성자를 private Singleton
외부 클래스가 사용할 수 없도록
대신 필드는 public
public class DataManager
{
private static DataManager instance;
public Dictionary<int, BlackCloud_DeckData> dicBlackCloudData;
//생성자
private DataManager()
{
}
public static DataManager GetInstance()
{
if (DataManager.instance == null)
{
DataManager.instance = new DataManager();
}
return DataManager.instance;
}
public void LoadDeckData(string path)
{
var json = File.ReadAllText(path);
var arr = JsonConvert.DeserializeObject<BlackCloud_DeckData[]>(json);
this.dicBlackCloudData = arr.ToDictionary(x => x.id);
Console.WriteLine(dicBlackCloudData.Count);
}
}
public class App
{
public App()
{
DataManager.GetInstance().LoadDeckData(@"C:\Users\TJOEUN\Desktop\blackCloud_deck.json");
var data = DataManager.GetInstance().dicBlackCloudData[100];
Console.WriteLine("{0}, {1}", data.card_name);
}
}
두 테이블 조인
public App()
{
DataManager.GetInstance().LoadData(@"C:\Users\TJOEUN\Desktop\WeaponData.json");
var data = DataManager.GetInstance().dicWeaponData[100];
Console.WriteLine("{0} {1}", data.id, data.name);
DataManager.GetInstance().LoadGradeData(@"C:\Users\TJOEUN\Desktop\GradeData.json");
var gdata = DataManager.GetInstance().dicGradeData[100];
Console.WriteLine("{0} {1}", gdata.id, gdata.name);
WeaponData weaponData = DataManager.GetInstance().dicWeaponData[100];
GradeData gradeData = DataManager.GetInstance().LoadGradeData(weaponData.grade_id);
}
public class DataManager
{
private static DataManager instance;
public Dictionary<int, WeaponData> dicWeaponData;
public Dictionary<int, GradeData> dicGradeData;
//생성자
private DataManager()
{
}
public static DataManager GetInstance()
{
if (DataManager.instance == null)
{
DataManager.instance = new DataManager();
}
return DataManager.instance;
}
public void LoadData(string path)
{
var json = File.ReadAllText(path);
var arr = JsonConvert.DeserializeObject<WeaponData[]>(json);
this.dicWeaponData = arr.ToDictionary(x => x.id);
}
public void LoadGradeData(string path)
{
var json = File.ReadAllText(path);
var arr = JsonConvert.DeserializeObject<GradeData[]>(json);
this.dicGradeData = arr.ToDictionary(x => x.id);
}
}
직렬화 > 객체에서 json 파일 저장
public class App
{
public App()
{
DataManager.GetInstance().LoadData(@"C:\Users\TJOEUN\Desktop\WeaponData.json");
DataManager.GetInstance().LoadGradeData(@"C:\Users\TJOEUN\Desktop\GradeData.json");
List<string> options = new List<string>()
{
"일반 몬스터 추가 데미지 1%",
"보스 몬스터 추가 데미지 2%",
"기본 공격력 +3"
};
//직렬화할 객체 생성 xxInfo 클래스
WeaponInfo info = new WeaponInfo(100,12.3f,"장검",true,options);
//직렬화 : 객체 > 문자열 (json)
string json = JsonConvert.SerializeObject(info);
Console.WriteLine(json);
//파일 저장
File.WriteAllText(@"C:\Users\TJOEUN\Desktop\Weapon_info.json",json);
}
}
public class WeaponInfo
{
public int Id;
public float damage;
public string name;
public bool isTest;
public List<string> opitons;
public WeaponInfo(int id, float damage, string name, bool isTest, List<string> options)
{
this.Id = id;
this.damage = damage;
this.name = name;
this.isTest = isTest;
this.opitons = options;
}
}
{
"Id": 100,
"damage": 12.3,
"name": "장검",
"isTest": true,
"opitons": [
"일반 몬스터 추가 데미지 1%",
"보스 몬스터 추가 데미지 2%",
"기본 공격력 +3"
]
}
'C# > 수업내용' 카테고리의 다른 글
0326 스레드 (0) | 2021.03.26 |
---|---|
0326 쿠키런 직렬화/역직렬화 (0) | 2021.03.26 |
0324 File 클래스 (외부 파일 불러오기) (0) | 2021.03.24 |
0324 복습 (0) | 2021.03.24 |
0323 대리자를 이용해 다중 메서드 호출 Multicast delegate/delegate chaining (0) | 2021.03.23 |