简明扼要地描述工厂设计模式

时间:2010-10-27 21:45:30

标签: design-patterns factory-pattern

我无法理解工厂设计模式的概念。据我所知,允许调用代码不必担心如何实例化单个对象,只需知道它将实现特定的接口。

我不知道如何保存任何代码。

例如,如果我有3种类型的车辆

lorry, car, van

我为每个人创建了一个类,我可以使用switch语句。到目前为止,我已经看过工厂类的例子,我可以有一个界面:

Interface vehicle {
    method drive();
}

然后是一个班级:

Class vehiclefac implements vehicle {
    method createvehicle(type) {
     // choose car type and return
}    
}

我仍然需要使用switch语句来选择我的车型,对此,如果我想添加新车,我仍然需要将它们添加到switch语句的末尾并创建一个合适的子类实施它们。

如果有人能够清楚地知道我不会感到非常感激,那么python中的例子尤其值得赞赏。

6 个答案:

答案 0 :(得分:1)

这不是关于代码的减少,而是关于依赖性解耦。如果您对接口进行编码,并使用工厂来检索实例,则无需知道您正在使用的具体类。如果项目后期有人编写了备用实现,则可以将工厂配置为使用新类而不修改工厂的客户端。

例如,假设一个工厂为数据序列化创建了流对象。实例可以请求流接口将自身序列化。根据配置或状态,可以将工厂配置为提供写入文件系统的实例。在不同的状态/配置中,它可以提供网络流实现。选择正确实现的工厂逻辑可以像需求一样简单或复杂,但客户端代码不需要了解各种实现。

项目中的代码不一定允许这样做,但代码是松散耦合的,并且更容易维护。

答案 1 :(得分:1)

factory method patternCreational pattern。它可用于构建特定基类型的对象,而无需指定确切的具体类型,这由工厂内的任何输入和创建逻辑确定。

public class VehicleFactory
{
     public IVehicle Create(int noOfWheels)
     {
        if (noOfWheels == 1)
            return new UniCycle();
        if (noOfWheels == 2)
            return new MotorCycle();
        if (noOfWheels == 3)
            return new Trike();
        if (noOfWheels == 4)
            return new Car();

        throw new NotImplementedException();
    }
}

public class UniCycle : IVehcicle { ... }
public class MotorCycle: IVehcicle { ... }
public class Trike: IVehcicle { ... }
public class Car: IVehcicle { ... }

以下是一个简单的C#示例,以您的车辆构思为基础。有用的是,任何消费代码都不关心具体类是什么,只是它返回一个IVehicle。它也不必使用接口,尽管我更喜欢它们,但也可以根据情况使用抽象基类来完成。

当我使用工厂模式时,我通常会在工厂实现一个接口,这称为Abstract Factory Pattern。对于这个例子,它将类似于:

public interface IVehicleFactory
{
    IVehicle Create(int noOfWheels);
}

然后可以将工厂注入班级(参见IoC)。它们一起给你:

  • 解密您的代码。
  • 允许不同的工厂实施。
  • 使用代码清理器,没有对象实例化。
  • 单元测试更容易,需要担心的复杂混凝土类更少。

我为抽象工厂模式提供的wiki链接在Python中有一些例子。

答案 2 :(得分:0)

工厂旨在封装开关逻辑。这意味着您无需担心在需要车辆的任何地方如何创建车辆,并且在添加新型车辆时无需在工厂以外的任何地方更改代码。

答案 3 :(得分:0)

将工厂视为“虚拟构造函数”。是的,您必须有一个公共接口,这是返回的对象的静态类型,但只要它们实现了该公共接口,您就可以创建任何类型。

对于添加新的子类型,您可以使用允许它的语言进行反射。我不知道(还)Python是否是其中之一。

答案 4 :(得分:0)

看看这里: Is this Factory Method creation pattern? 他们对你的问题提出异议。

答案 5 :(得分:0)

工厂方法模式是Creational模式。它将逻辑封装在应该为特定情况创建相同对象层次结构的特化上。