Rumah pembangunan bahagian belakang Tutorial C#.Net .NET简单工厂模式讲解

.NET简单工厂模式讲解

Dec 20, 2016 pm 01:19 PM
Corak kilang yang ringkas

简单工厂模式介绍:

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

结构模式图:

简单工厂模式

角色分类:

工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

引入实际情况:

如果有一个住户管理系统,里面的住户类型是可变的,每一种租户类型的租金计算公式都存在差异

A类型的住户租金额=天数*单价+绩效*0.005

B类型的住户租金额=月份*(每月价格+performance*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);
  }
}
Salin selepas log masuk

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;
    }
  }
}
Salin selepas log masuk

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);
    }
  }
}
Salin selepas log masuk

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("该商店不存在");
      }
    }
  }
}
Salin selepas log masuk

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();
    }
  }
}
Salin selepas log masuk

   

到这里我们实现了客户要求的两种类型商店的算法的需求,但是作为一种好的设计架构,还应该考虑到后面的需求变革,如果客户现在又增加了C类型商店和D类型商店,它们的算法要求又不一样,这个时候我们就需要进行C,D类型商店的创建,并继承Ishop接口,实现里面的方法,同时还得继续修改工厂类在switc中增加case进行捕捉创建相应的商店对象,一旦出现这样的情况,是不利于程序的扩展性和项目后期的维护性的。

优点:

简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对  象的尴尬局面中摆脱出来。

外界与具体类隔离开来,偶合性低。

明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

缺点:

工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则

虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。

出现的上诉情况,应该如何解决,值得思考,将在下一个工厂方法模式中得到很好的解决。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan corak kilang ringkas dalam PHP untuk meningkatkan kebolehgunaan semula kod Cara menggunakan corak kilang ringkas dalam PHP untuk meningkatkan kebolehgunaan semula kod Sep 05, 2023 pm 12:27 PM

Cara menggunakan corak kilang ringkas dalam PHP untuk meningkatkan kebolehgunaan semula kod

Bagaimana untuk melaksanakan kawalan dan pengurusan versi objek melalui corak kilang mudah berorientasikan objek PHP Bagaimana untuk melaksanakan kawalan dan pengurusan versi objek melalui corak kilang mudah berorientasikan objek PHP Sep 06, 2023 pm 02:39 PM

Bagaimana untuk melaksanakan kawalan dan pengurusan versi objek melalui corak kilang mudah berorientasikan objek PHP

Cara menggunakan corak kilang mudah dalam PHP untuk merealisasikan penciptaan objek secara automatik Cara menggunakan corak kilang mudah dalam PHP untuk merealisasikan penciptaan objek secara automatik Sep 05, 2023 pm 02:27 PM

Cara menggunakan corak kilang mudah dalam PHP untuk merealisasikan penciptaan objek secara automatik

Bagaimana untuk mencapai polimorfisme objek melalui corak kilang mudah berorientasikan objek PHP Bagaimana untuk mencapai polimorfisme objek melalui corak kilang mudah berorientasikan objek PHP Sep 05, 2023 am 08:43 AM

Bagaimana untuk mencapai polimorfisme objek melalui corak kilang mudah berorientasikan objek PHP

Perbincangan mendalam tentang pelaksanaan dan aplikasi corak kilang Java Perbincangan mendalam tentang pelaksanaan dan aplikasi corak kilang Java Feb 24, 2024 pm 10:15 PM

Perbincangan mendalam tentang pelaksanaan dan aplikasi corak kilang Java

Bagaimana untuk melaksanakan enkapsulasi objek dan bersembunyi melalui corak kilang mudah berorientasikan objek PHP Bagaimana untuk melaksanakan enkapsulasi objek dan bersembunyi melalui corak kilang mudah berorientasikan objek PHP Sep 05, 2023 pm 05:36 PM

Bagaimana untuk melaksanakan enkapsulasi objek dan bersembunyi melalui corak kilang mudah berorientasikan objek PHP

Cara mencipta contoh objek fleksibel menggunakan corak kilang mudah berorientasikan objek PHP Cara mencipta contoh objek fleksibel menggunakan corak kilang mudah berorientasikan objek PHP Sep 06, 2023 pm 02:12 PM

Cara mencipta contoh objek fleksibel menggunakan corak kilang mudah berorientasikan objek PHP

Analisis mendalam tentang tiga bentuk corak kilang Java yang berbeza Analisis mendalam tentang tiga bentuk corak kilang Java yang berbeza Feb 18, 2024 pm 01:24 PM

Analisis mendalam tentang tiga bentuk corak kilang Java yang berbeza

See all articles