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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.