type TSimpleFactory = Class class function CreateForm(FormName: string): TForm; end; implementation class function TSimpleFactory.CreateForm(FormName: string): TForm;begin Result := nil; if FormName = '销售订单' then Result := TfmSalesOrder.Create(Application) else if FormName = '生产单' then Result := TfmManufacturingOrder.Create(Application) else if FormName = '生产入库单' then Result := TfmProductToStock.Create(Application) else if FormName = '送货单' then Result := TfmDeliveryOrder.Create(Application);end; 也许有人认为上面的代码过于画蛇添足了,同样的功能完全可以用一个函数实现。如下: function CreateForm(FormName: String): TForm;begin Result := nil; if FormName = '销售订单' then Result := TfmSalesOrder.Create(Application) else if FormName = '生产单' then Result := TfmManufacturingOrder.Create(Application) else if FormName = '生产入库单' then Result := TfmProductToStock.Create(Application) else if FormName = '送货单' then Result := TfmDeliveryOrder.Create(Application);end; 这种观点对与错本人认为还是要看应用环境,如果是几千行的原型实现当然不用使用太多的技巧。其实该函数实现也是一种工厂模式,名叫“静态工厂”。 那么使用简单工厂(SimpleFactory)会给我们带来什么好处呢?这就要从面向对象编程的2大设计原则说起(详见我的另2篇博文) 。 1、要面对接口编程而不是面对实现编程。 2、封装变化 回过头看上面的代码恰恰就实践了这2大设计原则: 1、简单工厂的返回值是所有表单类型的超类(SuperType),这不但有助于我们在设计时为基类实现更多的功能而且也是上面提到的第一条编程原则“面向接口编程”的实践(原理见我介绍面向接口编程的博文)。 2、其次上面的代码实现了“封装变化”这一编程原则。在实现了上面的工厂类后,当我们创建表单时不再是在需要时由具体类构造出来,而是改为向工厂类请求一个构建表单的服务。比如在一个主界面同时拥有MainMenu和TreeView两中进入子模块的方式,按照传统方式就要分别为MainMenu和TreeView的onClick事件写下具体表单的构建函数,而使用简单工厂模式后只要向工厂传入FormName就可以了。如:CreateForm(GetFormName).Show;

评论