专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 简单工厂模式的详细介绍

简单工厂模式的详细介绍

更新时间:2022-06-08 10:00:57 来源:星辉 浏览619次

什么是简单工厂模式

工厂模式是“工厂是用于创建其他对象的对象”。简单工厂模式是Factory最简单形式的类(与工厂方法模式或抽象工厂模式相比)。换句话说,我们可以说:在简单工厂模式中,我们有一个工厂类,它有一个方法可以根据给定的输入返回不同类型的对象。

让我们通过一个例子来理解:

示例概述

为了实际理解简单工厂模式,我们以制造不同类型风扇的电气公司为例,我们将其称为FanFactory。但首先,我们将在不使用简单工厂模式的情况下实现此场景,然后会看到问题以及如何使用此模式解决这些问题。

下面的程序是一个简单的控制台应用程序,在这个程序中,Main方法用作创建一个TableFan. 在最简单的实现中,我们可以看到客户端能够TableFan根据需要直接创建一个(无需任何工厂)。

class Program
{
   static void Main(string[] args)
    {
           TableFan fan = new TableFan();
           fan.SwitchOn();
     }
}
class TableFan { }

没有简单工厂模式的问题

在上面的示例中,我们没有使用任何模式并且应用程序运行良好。但是如果我们考虑未来可能的变化并仔细观察,我们可以预见到当前实现存在以下问题:

在当前的应用程序中,无论哪里需要特定的风扇,它都是使用具体类创建的。将来,如果有任何更改是类名/提出了不同的具体类,您必须在整个应用程序中进行更改。例如TableFan,我们不需要引入类,而是引入BasicTableFan(现在应该使用它来代替旧TableFan类)和PowerTableFan类。因此,对Fan类的任何更改都会使代码难以维护,并且需要在许多地方进行许多更改。

目前,当客户端创建TableFan对象时,TableFan类的构造函数不带任何参数,因此Fan创建过程很容易。但是后来TableFan的对象创建过程发生了变化,如果Fan类的构造函数期望两个对象作为参数怎么办。然后代码客户端中的每个地方都需要在Fan创建对象的地方进行更改。例如:

TableFan fan = new TableFan(Moter moter, BladType bladType);

在创建对象TableFan fan = new TableFan(Moter moter, BladType bladType);时的代码Fan中,它有两种类型Moter,BladType. 在上面的代码中,客户端知道类,也知道对象的创建过程,这应该是FanFactory. 我们应该避免将此类对象创建细节和内部类暴露给客户端应用程序。

在某些情况下,必须集中对已创建对象的生命周期管理,以确保应用程序内的行为一致。如果客户可以按照自己的意愿自由创建具体对象,则无法做到这一点。这种情况经常发生在缓存管理和 DI 框架中。

在 C# 和 Java 中,类的构造函数必须与该类的名称相同。假设需要为构造函数提供描述性名称,例如CreateTableFanByModelNumber(int modelNumber). 在TableFan课堂上,我们最多可以有一个类似的构造函数, Fan(int modelNumber)但名称不像它的意图那样具有描述性。另一个关于描述性名称问题的类似示例也可在此维基百科页面上找到。

简单工厂模式的分辨率

为了解决上述问题,我们可以使用简单工厂模式,因为这种模式适合解决上述问题。此外,我们将继续使用相同的示例并修改现有代码。

当我们实现简单工厂模式时,需要创建一个类,该类将具有返回请求的对象实例的方法。让我们创建一个名为“ FanFactory”的类,它将实现一个名为“ IFanFactory”的接口。这个接口有一个方法被调用IFan CreateFan(FanType type);,它接受enum FanType并返回 a 的各个实例Fan。

现在Client将不知道具体的类,如TableFanor CeilingFan。客户将使用FanType enumand IFan interface。基于在enum调用“ CreateFan”方法时作为参数传递,FanFactory将返回所需风扇的实例。以下是修改后的应用程序代码:

enum FanType 
{ 
    TableFan, 
    CeilingFan, 
    ExhaustFan 
}接口IFan 
{ void SwitchOn ();
    无效开关();
} class TableFan : IFan {.... } class CeilingFan : IFan {.... } class ExhaustFan : IFan {..... } interface IFanFactory 
{ 
    IFan CreateFan(FanType type); 
} class FanFactory : IFanFactory 
{ public IFan CreateFan(FanType type) 
    { switch (type) 
        { case        
            FanType.TableFan:
                 return  new TableFan();
            case FanType.CeilingFan:
                 return  new CeilingFan();
            case FanType.ExhaustFan:
                 return  new ExhaustFan();
            默认:
                返回 新的TableFan(); 
        } 
    } 
} //客户端代码如下:static void Main(string[] args) 
{ 
        IFanFactory simpleFactory = new FanFactory();
        //
 使用简单工厂
        创建风扇 IFan fan = simpleFactory.CreateFan(FanType.TableFan); //使用创建的对象
        fan.SwitchOn(); 
        Console.ReadLine(); 
 }

现在我们将在“没有实现简单工厂模式的问题”部分确认简单工厂模式如何解决上述所有问题:

现在客户端正在使用接口和,所以如果我们更改为给定值创建FanFactory的具体类的名称,我们只需要在一个地方进行更改,即在“ ”方法内部。客户端代码完全不受影响。FanenumCreateFanFanFactory

如果稍后,Fan对象创建过程发生变化并且Fan类的构造函数期望两个或多个对象作为参数,我们只需要在 的 " CreateFan" 方法内进行更改FanFactory。客户端代码完全不受影响。

使用FanFactory,所有内部细节将对客户隐藏。所以它在抽象和安全方面是好的。

如果需要,我们可以编写生命周期管理逻辑以及集中式对象创建FanFactory。

在使用时FanFactory,我们可以简单地使用具有不同且更具描述性名称的方法,这些方法将返回IFan. 在我们的示例应用程序中,FanFactory可以将公共方法CreateTableFanByModelNumber(int modelNumber)公开给客户端。

以上就是关于“简单工厂模式的详细介绍”,大家如果对此比较感兴趣,想了解更多相关知识,不妨来关注一下星辉的Java设计模式,里面有更丰富的知识等着大家去学习,相信对大家会有所帮助的。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>