2010-10-27 58 views
0

Im我无法摆脱工厂设计模式的概念。据我了解,它允许调用代码不必担心个别对象如何实例化,只需知道它将实现特定的接口。对工厂设计模式的简洁描述

我不能看到这是如何保存任何代码,但。

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

lorry, car, van

的,我创建了一个类为他们每个人,我可以只使用一个switch语句。而与工厂类的实例香港专业教育学院迄今所看到的,我能有一个接口:

Interface vehicle { 
    method drive(); 
} 

,然后一类:

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

我还需要使用switch语句来接我的类型车辆,除此之外,如果我想添加新车,我仍然必须将它们添加到switch语句的末尾,并创建适当的子类来实现它们。

如果有人可以清理我没有得到id是非常感谢,python中的例子特别赞赏。

回答

1

这不是关于代码的减少,更多的是依赖关系的解耦。如果你编码到一个接口,并使用工厂来检索你的实例,你不需要知道你正在使用什么具体的类。如果稍后在项目中有人编写替代实现,则可以将工厂配置为使用新类而不修改工厂的客户端。

例如,想象一个为数据序列化创建流对象的工厂。一个实例可以请求一个流接口来自己序列化。根据配置或状态,可以将工厂配置为提供写入文件系统的实例。在不同的状态/配置中,它可能会发布网络流实现。选择正确实现的工厂逻辑可以像需求一样简单或复杂,但客户端代码不需要知道关于各种实现的任何信息。

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

0

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

0

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

至于添加新的子类型,你可以用允许它的语言进行反射来完成。我还不知道Python是否是其中之一。

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)。一起它给你:

  • 去耦你的代码。
  • 允许不同的工厂实现。
  • 使用代码清理器,没有对象实例化。
  • 单元测试更容易,更少复杂的具体类担心。

我为Abstract Factory Pattern提供的维基链接在Python中有一些示例。

0

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