首页 后端开发 C#.Net教程 .NET简单工厂模式讲解

.NET简单工厂模式讲解

Dec 20, 2016 pm 01:19 PM
简单工厂模式

简单工厂模式介绍:

简单工厂模式是属于创建型模式,又叫做静态工厂方法(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);
  }
}
登录后复制

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接口,实现里面的方法,同时还得继续修改工厂类在switc中增加case进行捕捉创建相应的商店对象,一旦出现这样的情况,是不利于程序的扩展性和项目后期的维护性的。

优点:

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

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

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

缺点:

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

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

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

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


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在PHP中应用简单工厂模式来提高代码的复用性 如何在PHP中应用简单工厂模式来提高代码的复用性 Sep 05, 2023 pm 12:27 PM

如何在PHP中应用简单工厂模式来提高代码的复用性简单工厂模式(SimpleFactoryPattern)是一种常用的设计模式,可以在创建对象时提供一种统一的接口,以便根据不同的条件来创建不同的实例。这种模式可以有效地降低代码的耦合度,提高代码的可维护性和复用性。在PHP中,我们可以利用简单工厂模式来优化代码的结构和逻辑。理解简单工厂模式简单工厂模式由三个

如何通过PHP面向对象简单工厂模式实现对象的版本控制和管理 如何通过PHP面向对象简单工厂模式实现对象的版本控制和管理 Sep 06, 2023 pm 02:39 PM

如何通过PHP面向对象简单工厂模式实现对象的版本控制和管理在开发大型的、复杂的PHP项目时,版本控制和管理是非常重要的一环。通过适当的设计模式,我们可以更好地管理和控制对象的创建和使用,从而提高代码的可维护性和扩展性。本文将介绍如何使用PHP面向对象简单工厂模式来实现对象的版本控制和管理。简单工厂模式是一种创建类的设计模式,它通过一个工厂类来实例化指定的对象

如何在PHP中应用简单工厂模式来实现对象的自动化创建 如何在PHP中应用简单工厂模式来实现对象的自动化创建 Sep 05, 2023 pm 02:27 PM

如何在PHP中应用简单工厂模式来实现对象的自动化创建简单工厂模式是一种常见的设计模式,它用于创建对象并抽象了实例化对象的过程。在PHP中,应用简单工厂模式可以帮助我们将对象的创建和具体实现解耦,使代码更加灵活和可维护。在本文中,我们将使用一个示例来说明如何在PHP中应用简单工厂模式。假设我们有一个电子产品店,它销售手机和电视机。我们需要根据用户的选择来创建相

如何通过PHP面向对象简单工厂模式实现对象的多态性 如何通过PHP面向对象简单工厂模式实现对象的多态性 Sep 05, 2023 am 08:43 AM

如何通过PHP面向对象简单工厂模式实现对象的多态性简单工厂模式是一种常见的设计模式,它可以通过一个共同的工厂类来创建不同类的对象,并且隐藏了对象的创建过程。PHP面向对象简单工厂模式可以帮助我们实现对象的多态性。简单工厂模式包含三个基本角色:工厂类、抽象类和具体类。首先我们来定义一个抽象类Animal,它包含一个抽象方法say():abstractclas

深入探讨Java工厂模式的实现与应用 深入探讨Java工厂模式的实现与应用 Feb 24, 2024 pm 10:15 PM

Java工厂模式的原理与应用详解工厂模式是一种常用的设计模式,它用于创建对象,以及将对象的创建过程封装起来。Java中的工厂模式有多种实现方式,其中最常见的有简单工厂模式、工厂方法模式和抽象工厂模式。本文将详细介绍这三种工厂模式的原理和应用,并给出相应的代码示例。一、简单工厂模式简单工厂模式是最简单、最常用的工厂模式。它通过一个工厂类,根据传入的参数来返回不

深度剖析Java工厂模式的三种不同形式 深度剖析Java工厂模式的三种不同形式 Feb 18, 2024 pm 01:24 PM

Java工厂模式是一种创建对象的设计模式,它将对象的创建过程抽象出来,以便在运行时决定实例化哪个具体的类。它通过将实例化逻辑从客户端代码中分离出来,使得代码更加可维护、灵活和可扩展。工厂模式有三种常见的变体,分别是简单工厂模式、工厂方法模式和抽象工厂模式。下面将对这三种变体进行详细解析,并提供具体的代码示例。一、简单工厂模式简单工厂模式(SimpleFac

如何使用PHP面向对象简单工厂模式创建可测试的对象实例 如何使用PHP面向对象简单工厂模式创建可测试的对象实例 Sep 05, 2023 pm 02:45 PM

如何使用PHP面向对象简单工厂模式创建可测试的对象实例简单工厂模式是一种常用的软件设计模式,它可以帮助我们根据不同的条件创建不同的对象实例。在PHP面向对象编程中,结合简单工厂模式可以提高代码的可测试性和可维护性。在本文中,我们将学习如何使用PHP面向对象简单工厂模式创建可测试的对象实例。我们将以一个简单的示例来说明这个过程。首先,让我们定义一个接口来表示要

如何通过PHP面向对象简单工厂模式实现对象的封装和隐藏 如何通过PHP面向对象简单工厂模式实现对象的封装和隐藏 Sep 05, 2023 pm 05:36 PM

如何通过PHP面向对象简单工厂模式实现对象的封装和隐藏简介:在PHP面向对象编程中,封装是一种实现数据隐藏的重要概念。封装可以将数据和相关的操作封装在一个类中,并通过对外暴露的公共接口来操作数据。而简单工厂模式则是一种常用的创建对象的设计模式,它将对象的创建与使用分离,使得系统更加灵活,易于扩展。本文将结合示例代码,介绍如何通过PHP面向对象简单工厂模式来实

See all articles