심플 팩토리 패턴 소개:
심플 팩토리 패턴은 생성 패턴으로 정적 팩토리 메소드(Static Factory Method) 패턴이라고도 불리지만 GOF 23가지 디자인 패턴 중 하나는 아닙니다. 단순 팩토리 패턴은 팩토리 객체를 사용하여 생성할 제품 클래스 인스턴스를 결정합니다. 단순 팩토리 패턴은 팩토리 패턴 계열 중 가장 단순하고 실용적인 패턴으로, 다양한 팩토리 패턴을 특수하게 구현한 것으로 이해될 수 있습니다.
구조 패턴 다이어그램:
역할 분류:
Factory(Creator) 역할
심플함의 핵심 모든 인스턴스를 생성하기 위한 내부 논리 구현을 담당하는 팩토리 패턴입니다. 팩토리 클래스에서 제품 클래스를 생성하는 방법은 외부에서 직접 호출하여 필요한 제품 객체를 생성할 수 있습니다.
추상 제품 역할
간단한 팩토리 패턴으로 생성된 모든 객체의 상위 클래스로, 모든 인스턴스에 공통적인 공용 인터페이스를 설명하는 역할을 담당합니다.
Concrete Product 역할
은 간단한 팩토리 패턴의 생성 대상입니다. 생성된 모든 객체는 이 역할을 수행하는 특정 클래스의 인스턴스입니다.
실태 소개:
임차인 관리 시스템이 있는 경우 그 안에 임차인 유형이 가변적이며, 임차인 유형별로 임대료 계산 공식이 다릅니다
A유형 임대료 = 일수*단가+성능*0.005
B유형 임대료 = 월*(월가격+성능*0.001)
분석:
1. 매장은 공통된 계산 방법을 가지고 있습니다. 그러나 이는 서로 다른 방식으로 동작합니다. 따라서 매장 클래스를 추상화하고 코드는 다음과 같습니다. >
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.IFactroy { public interface Ishop { double Getrent(int days, double dayprice, double performance); } }
using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.product { //A类型的商店的创建 public class Ashop:Ishop { /// <summary> /// /// A类型商店租金额,天数*单价+绩效*0.005 /// </summary> /// <param name="days">天数</param> /// <param name="dayprice">每天单价</param> /// <param name="performance">日平均绩效</param> /// <returns></returns> public double Getrent(int days, double dayprice, double performance) { Console.WriteLine("A商店的租金算法"); return days * dayprice + performance * 0.01; } } }
using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.product { /// <summary> /// B类型的商店的创建 /// </summary> public class Bshop:Ishop { /// <summary> /// B类型商店的租金=月份*(每月价格+performance*0.001) /// </summary> /// <param name="month">月数</param> /// <param name="monthprice">月单价</param> /// <param name="performance">月平均绩效</param> /// <returns></returns> public double Getrent(int month, double monthprice, double performance) { Console.WriteLine("B商店的租金算法"); return month * (monthprice + performance * 0.001); } } }
using SimpleFactory.App.IFactroy; using SimpleFactory.App.product; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.factoryMethod { public class factorymethod { public Ishop CreateShow(string show) { switch (show.Trim().ToLower()) { case"ashop": return new Ashop(); case "bshop": return new Ashop(); default: throw new Exception("该商店不存在"); } } } }
using SimpleFactory.App.factoryMethod; using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App { class Program { static void Main(string[] args) { Ishop As; factorymethod afm = new factorymethod(); As = afm.CreateShow("ashop"); //a 类型的某商店 double total = As.Getrent(30, 300, 2000); //30 天/100元 日平均绩效为2000 Console.WriteLine("该A类型商店的租金为:" + total); Console.WriteLine("============="); Ishop Bs; factorymethod bfm = new factorymethod(); Bs = bfm.CreateShow("bshop"); //b 类型的某商店 total = Bs.Getrent(3, 3000, 60000); //3 月/4000元 月平均绩效为60000 Console.WriteLine("该B类型商店的租金为:" + total); Console.ReadKey(); } } }