집 >백엔드 개발 >C#.Net 튜토리얼 >.NET 단순 팩토리 패턴 설명
심플 팩토리 패턴 소개:
심플 팩토리 패턴은 생성 패턴으로 정적 팩토리 메소드(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); } }2. 매장을 추상화한 후 특정 제품 클래스를 만들어야 합니다. 여기에 매장의 동작 방법을 구현하는 특정 유형의 매장이 있습니다. . A 유형의 매장 생성
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; } } }3. B 유형의 매장 생성:
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); } } }4. 숫자형 스토어를 생성하고 메소드를 구현한 뒤 어떤 상황에서 저런 객체를 생성할지 고민하다가 심플팩토리 패턴의 핵심인 팩토리 클래스가 나왔습니다
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("该商店不存在"); } } } }5. 그런 다음 현재 매장 유형을 기준으로 이 유형의 매장에 어떤 알고리즘을 사용해야 하는지 판단합니다.
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(); } } }여기에서는 고객이 요구하는 두 가지 유형의 매장에 대한 알고리즘 요구 사항을 구현했습니다. 그러나 좋은 디자인 아키텍처로서 고객의 후속 수요 변화도 고려해야 합니다. 이제 C형 매장과 D형 매장의 알고리즘 요구 사항이 다릅니다. 이때 C형 및 D형 매장을 생성하고 Ishop 인터페이스를 상속하며 내부 메소드를 구현하는 동시에 계속해서 공장을 수정해야 합니다. 스위치에 클래스를 추가하고 해당 저장소 개체를 캡처하고 생성하면 이러한 상황이 발생하면 프로그램의 확장성과 이후 프로젝트의 유지 관리에 도움이 되지 않습니다. 장점: 간단한 팩토리 패턴은 외부 세계에서 제공한 정보를 기반으로 어떤 특정 클래스의 개체를 만들어야 하는지 결정할 수 있습니다. 이를 통해 외부 세계가 특정 제품 객체를 직접 생성해야 하는 당혹스러운 상황을 없앨 수 있다. 외부 세계는 콘크리트 클래스와 격리되어 있으며 결합도가 낮습니다. 각각의 책임과 권한을 명확하게 구분하여 전체 소프트웨어 아키텍처를 최적화하는 데 도움이 됩니다.