> 백엔드 개발 > C#.Net 튜토리얼 > .NET 단순 팩토리 패턴 설명

.NET 단순 팩토리 패턴 설명

高洛峰
풀어 주다: 2016-12-20 13:19:48
원래의
1326명이 탐색했습니다.

심플 팩토리 패턴 소개:

심플 팩토리 패턴은 생성 패턴으로 정적 팩토리 메소드(Static Factory Method) 패턴이라고도 불리지만 GOF 23가지 디자인 패턴 중 하나는 아닙니다. 단순 팩토리 패턴은 팩토리 객체를 사용하여 생성할 제품 클래스 인스턴스를 결정합니다. 단순 팩토리 패턴은 팩토리 패턴 계열 중 가장 단순하고 실용적인 패턴으로, 다양한 팩토리 패턴을 특수하게 구현한 것으로 이해될 수 있습니다.

구조 패턴 다이어그램:

.NET 단순 팩토리 패턴 설명

역할 분류:

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 인터페이스를 상속하며 내부 메소드를 구현하는 동시에 계속해서 공장을 수정해야 합니다. 스위치에 클래스를 추가하고 해당 저장소 개체를 캡처하고 생성하면 이러한 상황이 발생하면 프로그램의 확장성과 이후 프로젝트의 유지 관리에 도움이 되지 않습니다.

장점:

간단한 팩토리 패턴은 외부 세계에서 제공한 정보를 기반으로 어떤 특정 클래스의 개체를 만들어야 하는지 결정할 수 있습니다. 이를 통해 외부 세계가 특정 제품 객체를 직접 생성해야 하는 당혹스러운 상황을 없앨 수 있다.

외부 세계는 콘크리트 클래스와 격리되어 있으며 결합도가 낮습니다.

각각의 책임과 권한을 명확하게 구분하여 전체 소프트웨어 아키텍처를 최적화하는 데 도움이 됩니다.


단점:

팩토리 클래스는 모든 인스턴스의 생성 논리에 집중하므로 GRASPR의 높은 응집력 책임 할당 원칙을 쉽게 위반합니다.

간단한 팩토리 패턴은 다음과 같을 수 있지만 적응된 변화가 있지만 해결할 수 있는 문제는 훨씬 제한적입니다. 생성할 수 있는 클래스는 사전에만 고려할 수 있습니다. 새 클래스를 추가해야 하는 경우 팩토리 클래스를 변경해야 합니다.


발생하는 어필 상황을 어떻게 해결할지는 생각해 볼 가치가 있으며 다음 팩토리 메소드 패턴에서 잘 해결될 것입니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿