我无法理解工厂设计模式的概念。据我所知,允许调用代码不必担心如何实例化单个对象,只需知道它将实现特定的接口。
我不知道如何保存任何代码。
例如,如果我有3种类型的车辆 lorry, car, van
我为每个人创建了一个类,我可以使用switch语句。到目前为止,我已经看过工厂类的例子,我可以有一个界面:
Interface vehicle {
method drive();
}
然后是一个班级:
Class vehiclefac implements vehicle {
method createvehicle(type) {
// choose car type and return
}
}
我仍然需要使用switch语句来选择我的车型,对此,如果我想添加新车,我仍然需要将它们添加到switch语句的末尾并创建一个合适的子类实施它们。
如果有人能够清楚地知道我不会感到非常感激,那么python中的例子尤其值得赞赏。
答案 0 :(得分:1)
这不是关于代码的减少,而是关于依赖性解耦。如果您对接口进行编码,并使用工厂来检索实例,则无需知道您正在使用的具体类。如果项目后期有人编写了备用实现,则可以将工厂配置为使用新类而不修改工厂的客户端。
例如,假设一个工厂为数据序列化创建了流对象。实例可以请求流接口将自身序列化。根据配置或状态,可以将工厂配置为提供写入文件系统的实例。在不同的状态/配置中,它可以提供网络流实现。选择正确实现的工厂逻辑可以像需求一样简单或复杂,但客户端代码不需要了解各种实现。
项目中的代码不一定允许这样做,但代码是松散耦合的,并且更容易维护。
答案 1 :(得分:1)
factory method pattern是Creational 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模式。它将逻辑封装在应该为特定情况创建相同对象层次结构的特化上。