petshop 4.0 학습 노트 의 디자인 모델

petshop 4.0 에서 도 몇 가지 자주 사용 하 는 디자인 모델 을 사 용 했 습 니 다. 간단 한 공장 모델, 공장 방법 모델, 전략 모델, 그리고 반사 와 배치 파일 을 첨부 합 니 다. 다음은 제 이해 로 백화 로 말씀 드 리 겠 습 니 다.
1. 간단 한 공장 모델.
 예 를 들 어 A 는 B 와 함께 코드 를 쓰 고 A 는 프런트 를 맡 고 B 는 백 스테이지 를 맡 으 며 B 는 두 가지 유형 을 썼 다. X 와 Y, A 는 호출 을 맡 았 다. 그러면 1. A 는 B 가 X 와 Y 두 가지 유형 을 썼 는 지 어떻게 알 았 을 까?2. B 가 Z 클래스 를 추가 하면 어떻게 합 니까? 3. A 는 코드 에 n 개의 X 를 썼 습 니 다. x = new X (), B 는 X 류 의 이름 을 바 꾸 거나 다시 쓰 면 어떻게 합 니까? 이러한 어려움 을 해결 하기 위해 간단 한 공장 모델 을 제 시 했 습 니 다. 다시 말 하면 하나의 기본 클래스 나 인터페이스 가 있 습 니 다. 그리고 n 개의 종 류 는 이 를 계승 하고 하나의 종 류 를 공장 으로 작성 합 니 다. 그 안에 정적 인 방법 은 전입 매개 변수 에 따라 기본 클래스 나 인터페이스 에서 계승 하 는 구체 적 인 대상 으로 돌아 가 는 것 을 책임 집 니 다.
    public interface IPerson
    {
        string GetName();
    }

    public class Kernel : IPerson
    {
        public string GetName()
        {
            return "Kernel";
        }
    }

    public class Json : IPerson
    {
        public string GetName()
        {
            return "Json";
        }
    }

    public class PersonFactory
    {
        public static IPerson CreateInstance(string name)
        {
            string path = ConfigurationManager.AppSettings["AssemblyName"];
            string className = "";
            switch (name)
            {
                case "kernel":
                    className = ConfigurationManager.AppSettings["kernelClass"];
                    break;
                default:
                    className = ConfigurationManager.AppSettings["JsonClass"];
                    break;
            }
            return Assembly.Load(path).CreateInstance(className) as IPerson;
        }
    }

    static void Main(string[] args)
        {
            IPerson p1 = PersonFactory.CreateInstance("kernel");
            Console.WriteLine(p1.GetName());
            IPerson p2 = PersonFactory.CreateInstance("Json");
            Console.WriteLine(p2.GetName());
            Console.ReadKey();
        }

변경 이 있 으 면 지금 공장 류 만 바 꾸 면 됩 니 다. 그러면 어느 정도 호출 대상 의 변경 으로 인해 코드 의 재 작성 을 면 할 수 있 습 니 다.
 
2. 공장 방법 모델
종류 가 많 지 않 을 때 보통 간단 한 공장 을 사용한다. 만약 종류 가 매우 많다 면, 너 는 이 공장 이 매우 크다 는 것 을 알 게 될 것 이다. 이때 이 공장 에 대해 분해 해 야 한다. 공장 방법 모델 은 이렇게 제시 해 야 한다.
공장 방법 모델 은 개인 적 으로 본질 적 으로 공장 에 대해 서도 한 번 공장 을 만 들 었 다 고 생각 합 니 다. 먼저 공장 으로 특정한 종류의 공장 을 만 든 다음 에 특정한 유형의 공장 으로 당신 이 필요 로 하 는 구체 적 인 대상 을 만 듭 니 다.
    public interface IPerson
    {
        string GetName();
    }

    public class Kernel : IPerson
    {
        public string GetName()
        {
            return "Kernel";
        }
    }

    public class Json : IPerson
    {
        public string GetName()
        {
            return "Json";
        }
    }

    public interface ICreatePerson
    {
        IPerson CreateInstance();
    }

    public class CreateKernelFactory : ICreatePerson
    {
        public IPerson CreateInstance()
        {
            string path = ConfigurationManager.AppSettings["AssemblyName"];
            string className = ConfigurationManager.AppSettings["kernelClass"];
            return Assembly.Load(path).CreateInstance(className) as IPerson;
        }
    }

    public class CreateJsonFactory : ICreatePerson
    {
        public IPerson CreateInstance()
        {
            string path = ConfigurationManager.AppSettings["AssemblyName"];
            string className = ConfigurationManager.AppSettings["jsonClass"];
            return Assembly.Load(path).CreateInstance(className) as IPerson;
        }
    }
    static void Main(string[] args)
        {
            ICreatePerson c1 = new CreateKernelFactory();
            IPerson p1 = c1.CreateInstance();
            ICreatePerson c2 = new CreateJsonFactory();
            IPerson p2 = c2.CreateInstance();
            Console.WriteLine(p1.GetName());
            Console.WriteLine(p2.GetName());
            Console.ReadKey();
        }

 
3. 전략 모드
가끔 은 일부 수요 가 대체적으로 똑 같다 는 것 을 알 게 될 것 이다. 같은 유형 은 바로 계산 방식 이 다르다 는 것 이다. 이때 전략 모델 을 사용 할 수 있다.
public interface IBuy
    {
        string GetCharge();
    }

    public class CashBuy : IBuy
    {
        double charge;
        double cut;
        public CashBuy(double charge, double cut)
        {
            this.charge = charge;
            this.cut = cut;
        }
        public string GetCharge()
        {
            return (charge - cut).ToString();
        }
    }

    public class CreditBuy : IBuy
    {
        double charge;
        double precent;
        public CreditBuy(double charge, double precent)
        {
            this.charge = charge;
            this.precent = precent;
        }
        public string GetCharge()
        {
            return (charge * precent).ToString();
        }
    }

    public class Context
    {
        IBuy buy;
        public Context(IBuy buy)
        {
            this.buy = buy;
        }

        public string GetCharge()
        {
            return buy.GetCharge();
        }
    }

    static void Main(string[] args)
        {
            Context c1 = new Context(new CashBuy(200, 40));
            Context c2 = new Context(new CreditBuy(200, 7));
            Console.WriteLine(c1.GetCharge());
            Console.WriteLine(c2.GetCharge());
            Console.ReadKey();
        }

  여기 서 인터페이스 new 로 구체 적 인 대상 을 만 들 지 않 고 Context 대상 을 통일 적 으로 사용 하 며 Context 를 통 해 결 과 를 얻 을 수 있 습 니 다. 사실 이것 은 공장 모델 을 통 해 똑 같은 결 과 를 얻 을 수 있 지만 그들의 측정 중점 은 다 릅 니 다. 예 를 들 어 정렬 알고리즘 은 제 가 원 하 는 것 은 알고리즘 을 선택 하 는 것 입 니 다. 그러나 이런 알고리즘 은 하나의 전략 입 니 다. 이런 알고리즘 은 실제 적 으로 서로 대체 할 수 있 습 니 다.즉, 빠 른 정렬, 기수 정렬 은 모두 문 제 를 실현 할 수 있 습 니 다. 저 는 한 가지 만 선택 하 라 고 요구 합 니 다. 공장 에서 만 든 것 이 아니 라 제품 A (그 는 요구 에 따라 선택 하 는 것 이지 A 만 만 만 만 드 는 것 이 아 닙 니 다) 를 만 듭 니 다. 그 와 제품 B 는 서로 대체 할 수 없습니다.
그러나 순수한 전략 모델 은 A 가 B 가 구체 적 으로 어떤 대상 을 구 조 했 는 지 알 아야 한다. 간단 한 공장 을 이야기 할 때 발생 하 는 문제 들 이 나타 날 수 있 기 때문에 우 리 는 간단 한 공장 과 전략 모델 을 함께 사용한다.
4. 단순 공장 + 전략 모델
public enum BuyType
    { 
        Cash,
        Credit
    }

    public interface IBuy 
    {
        double GetPrice();
    }

    public class CashBuy : IBuy
    {
        double price;
        double cut;

        public CashBuy(double price, double cut)
        {
            this.price = price;
            this.cut = cut;
        }

        public double GetPrice()
        {
            return price - cut;
        }
    }

    public class CreditBuy : IBuy
    {
        double price;
        double precent;

        public CreditBuy(double price, double precent)
        {
            this.precent = precent;
            this.price = price;
        }

        public double GetPrice()
        {
            return price * (1 - precent);
        }
    }

    public class Content
    {
        IBuy buy = null;

        public Content(BuyType buyType, double price, double cut)
        {
            string path = ConfigurationManager.AppSettings["SimpeFactoryAndStrategyAssemble"];
            string className = "";
            switch (buyType)
            {
                case BuyType.Cash:
                    className = ConfigurationManager.AppSettings["cash"];
                    break;
                default:
                    className = ConfigurationManager.AppSettings["credit"];
                    break;
            }
            //buy = Assembly.Load(path).CreateInstance(className, false, BindingFlags.Default, null, new object[] { price, cut }, null, null) as IBuy;
            Type type = Type.GetType(className, true);
            buy = Activator.CreateInstance(type, price, cut) as IBuy;
        }

        public double GetPrice()
        {
            return buy.GetPrice();
        }
    }

    static void Main(string[] args)
        {
            Content c1 = new Content(BuyType.Cash, 200, 40);
            Content c2 = new Content(BuyType.Credit, 200, 0.7);
            Console.WriteLine(c1.GetPrice().ToString());
            Console.WriteLine(c2.GetPrice().ToString());
            Console.ReadKey();
        }

 
데모 다운로드:
http://ljzforever.qupan.com/?folder=951925
 
참고 한 글:
간단 한 공장 모델 & 전략 모델 - 독서 노트 1
http://hi.baidu.com/springlie/blog/item/6052ad010f26670e1c958366.html
단일 직책 원칙 과 & 개방 - 폐쇄 원칙 - 독서 노트 2
http://hi.baidu.com/springlie/blog/item/4d01d5c878efc01f7e3e6f59.html
전략 모델 과 추상 적 인 공장 모델 의 차 이 는 어디 에 있 습 니까? 나 는 어떻게 두 가지 가 다르다 고 생각 합 니까?! 구분 하기 위해 구분 합 니까??
http://topic.csdn.net/t/20050108/17/3709567.html
공장 모델 을 깊이 파고 들 어 알 기 쉽다.
http://blog.csdn.net/ai92/archive/2004/12/26/229825.aspx
깊이 들 어가 기 쉬 운 전략 모델
http://blog.csdn.net/ai92/archive/2004/12/26/229825.aspx
간단 한 공장 모델 과 전략 모델 학습 노트
  http://www.cnblogs.com/sun11086/archive/2009/02/06/1385510.html
단순 공장 모델 과 공장 방법 모델
http://hi.baidu.com/wookoo/blog/item/b49f1ac7f89d87ded1006097.html
전략 모델 과 공장 모델 의 차이
http://www.cnblogs.com/ac1985482/archive/2009/03/07/1405608.html

좋은 웹페이지 즐겨찾기