设计模式、用Delphi描述-->Abstract Factory模式

原创 2001年11月01日 14:43:00

Abstract Factory模式(抽象工厂)

起源<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Delphi中的Abstract Factory模式在基本Abstract Factory模式进行了扩展。更多Abstract Factory模式的资料请参阅 [Gam+]

目的

提供一个创建一系列相关或互依赖对象的接口,面无需指定它们的具体的类。

动机

这种模式是将你的应用与具体的类分类的最好办法,比如说,你要覆盖Delphi的公正的VCL

你可以创建一个抽象工厂来实现自己的要组件。

应用

下面的例子使用一个抽象类工厂和两个实际的类工厂来实现不同特色的用户界面组件。TOAbstractFactory是一个单一的组件单独的类,以每个产品系列通常只需要个工厂。

 

TOAbstractFactory = class(TObject)

  public

    constructor Create;

    destructor Destroy; override;

    { 抽象的构造}

    function CreateSpeedButton(AOwner: TComponent): TSpeedButton; virtual; abstract;

    function CreateEdit(AOwner: TComponent): TEdit; virtual; abstract;

    function CreateLabel(AOwner: TComponent): TLabel; virtual; abstract;

  end;

 

TORedFactoryTOBlueFactory重载了抽象的接口,用来支持装饰不同的特色界面。

 

TORedFactory = class(TOAbstractFactory)

  public

    {红色构造器 }

    function CreateSpeedButton(AOwner: TComponent): TSpeedButton; override;

    function CreateEdit(AOwner: TComponent): TEdit; override;

    function CreateLabel(AOwner: TComponent): TLabel; override;

  end;

 

TOBlueFactory = class(TOAbstractFactory)

  public

    {蓝色构造器}

    function CreateSpeedButton(AOwner: TComponent): TSpeedButton; override;

    function CreateEdit(AOwner: TComponent): TEdit; override;

    function CreateLabel(AOwner: TComponent): TLabel; override;

  end;

有上面的接口中:

·      声明了一个创建抽象产品对象的接口:TOAbstractFactory

¨    TOAbstractFactory有三个抽象的工厂方法CreateSpeedButtonCreateEditCreateLabel

·      TORedFactoryTOBlueFactory用来实现创建具体产品对象的方法

下面是TORedFactory的实现代码:

·     unit Redfact;

·     interface

·     uses

·       Classes, SysUtils, StdCtrls, Graphics, Abstfact, Buttons;

·     type

·       TORedFactory = class(TOAbstractFactory)

·       public

·         { 实际的构造器}

·         function CreateSpeedButton(AOwner: TComponent): TSpeedButton; override;

·         function CreateEdit(AOwner: TComponent): TEdit; override;

·         function CreateLabel(AOwner: TComponent): TLabel; override;

·       end;

·      

·     implementation

·     {具体的构造,被工厂方法隐藏}

·     type

·       TRedSpeedButton = class(TSpeedButton)

·       public

·         constructor Create(AOwner: TComponent); override;

·       end;

·      

·       TRedEdit = class(TEdit)

·       public

·         constructor Create(AOwner: TComponent); override;

·       end;

·      

·       TRedLabel = class(TLabel)

·       public

·         constructor Create(AOwner: TComponent); override;

·       end;

·      

·     { widget implementation }

·      

·     { TRedButton }

·      

·     constructor TRedSpeedButton.Create(AOwner: TComponent);

·     begin

·       inherited Create(AOwner);

·       Font.Color := clRed;

·     end;

·      

·     { TRedEdit }

·      

·     constructor TRedEdit.Create(AOwner: TComponent);

·     begin

·       inherited Create(AOwner);

·       Font.Color := clRed;

·     end;

·      

·     { TRedLabel }

·      

·     constructor TRedLabel.Create(AOwner: TComponent);

·     begin

·       inherited Create(AOwner);

·       Font.Color := clRed;

·     end;

·      

·      

·     { the concrete factory }

·      

·     function TORedFactory.CreateSpeedButton(AOwner: TComponent): TSpeedButton;

·     begin

·       Result := TRedSpeedButton.Create(AOwner);

·     end;

·      

·     function TORedFactory.CreateEdit(AOwner: TComponent): TEdit;

·     begin

·       Result := TRedEdit.Create(AOwner);

·     end;

·      

·     function TORedFactory.CreateLabel(AOwner: TComponent): TLabel;

·     begin

·       Result := TRedLabel.Create(AOwner);

·     end;

end.

 

运行的时候,我们的客户程序的实例由类的工厂具体类创建。并且客户程序不需知道使用工厂的具体子类。

 

 

Delphi实例

正在组织

【java设计模式】之 抽象工厂(Abstract Factory)模式

1. 女娲的失误         上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别……这失误也忒大了点吧……竟然没有性别,那岂不是……无奈,只好抹掉重来了,于是所...
  • eson_15
  • eson_15
  • 2016年04月26日 23:49
  • 11308

设计模式——抽象工厂模式(Abstract Factory)

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 抽象设计模式概念:         针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设...
  • u012909091
  • u012909091
  • 2014年08月02日 16:52
  • 3516

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。...
  • wenniuwuren
  • wenniuwuren
  • 2015年01月29日 02:25
  • 1672

我所理解的设计模式(C++实现)——抽象工厂模式(Abstract Factory Pattern)

解决的问题:        在系统里a,b,c三个组件必须同时使用,但是a的同类 a1和a2这三种方法有共同特点但是是互斥的,b,b1,b2和c,c1,c2和a/a1/a2是一样的。就比如说创建在不...
  • tanningzhong
  • tanningzhong
  • 2015年01月24日 14:51
  • 480

设计模式(1) 创建型模式和抽象工厂(Abstract Factory)

问题聚焦:分别用一句话概括这节的几个知识点 1 什么是创建型模式:抽象了实例化过程 2 创建型模式有哪些:抽象工厂,工厂方法,原型模式,生成器模式 3 什么是抽象工厂(AbstractFactory)...
  • zs634134578
  • zs634134578
  • 2014年01月03日 09:48
  • 1349

【java设计模式】之 工厂(Factory)模式

1.工厂模式的定义         工厂模式使用的频率非常高,我们在开发中总能见到它们的身影。其定义为:Define an interface for creating an object, but ...
  • eson_15
  • eson_15
  • 2016年04月23日 10:48
  • 13496

Python实现设计模式--02.工厂模式(Factory Pattern)

《设计模式》涉及到创建类的几种模式,共同的也是最根本的原则就是:不要new 对象!!!既然如此,告诉我你最先想到的是如何得到对象呢?没错,“你不让我new,那你给我个get对象的工具吧,别的我不管”。...
  • boy_vansun
  • boy_vansun
  • 2017年07月26日 00:36
  • 125

Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)

提出疑问这几天研究工厂模式的时候,看到网上的一些文章中举的例子我就很疑惑,我相信这也是许多人的疑惑:工厂模式的功能就是创建实例,我们创建实例直接new不就完了吗,干嘛还得再封装一层工厂类,然后用工厂类...
  • nugongahou110
  • nugongahou110
  • 2015年12月29日 13:36
  • 6092

设计模式--Abstract Factory模式

常用设计模式之抽象工厂模式
  • bible_reader
  • bible_reader
  • 2016年09月18日 16:58
  • 66

Java学习笔记之抽象(abstract)与模板方法设计模式

abstract:抽象的,可以用来修饰类、方法 1、修饰类:抽象类 抽象类不能被实例化抽象类有构造器(凡是类都有构造器)抽象方法所在的类一定是抽象类。 抽象类中可以没有抽象方法。 2...
  • u012815527
  • u012815527
  • 2015年04月01日 15:57
  • 831
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式、用Delphi描述-->Abstract Factory模式
举报原因:
原因补充:

(最多只允许输入30个字)