0325 싱글턴 패턴

2021. 3. 25. 15:19C#/수업내용

디자인 패턴은 하나의 클래스가 단지 하나의 인스턴스만 갖도록 제한한다.

전역 범위에서 그 인스턴스를 엑세스할 수 있게 하는 패턴이다.

일반적으로 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"
  ]
}