意图:抽象工厂用于创建一组或一系列相关的对象并提供一个统一的接口。

优点:很容易就能扩展一组对象,只需继承抽象工厂即可。

缺点:若想增加抽象产品就要修改抽象工厂的接口了。

 

 

QQ农场中购买饰品的例子可以很好的理解抽象工厂模式,如图:

 

抽象工厂模式在QQ农场游戏中的应用

 

背景、房子、狗窝、栅栏就是抽象工厂中的抽象产品。示意代码:

下面是抽象产品:

 

代码
 1抽象工厂模式在QQ农场游戏中的应用{抽象背景}
 2抽象工厂模式在QQ农场游戏中的应用
 3抽象工厂模式在QQ农场游戏中的应用unit uBackground; 
 4抽象工厂模式在QQ农场游戏中的应用
 5抽象工厂模式在QQ农场游戏中的应用interface
 6抽象工厂模式在QQ农场游戏中的应用
 7抽象工厂模式在QQ农场游戏中的应用type
 8抽象工厂模式在QQ农场游戏中的应用  TBackground = class(TObject)
 9抽象工厂模式在QQ农场游戏中的应用  public
10抽象工厂模式在QQ农场游戏中的应用    procedure Buy; virtualabstract;
11抽象工厂模式在QQ农场游戏中的应用  end;
12抽象工厂模式在QQ农场游戏中的应用
13抽象工厂模式在QQ农场游戏中的应用implementation
14抽象工厂模式在QQ农场游戏中的应用
15抽象工厂模式在QQ农场游戏中的应用end.

 

其它抽象产品代码略。

下面是抽象工厂,‘创建了’一组相关的抽象产品:

 

代码
 1抽象工厂模式在QQ农场游戏中的应用unit uAbstractFacilitiesFactory;
 2抽象工厂模式在QQ农场游戏中的应用
 3抽象工厂模式在QQ农场游戏中的应用interface
 4抽象工厂模式在QQ农场游戏中的应用
 5抽象工厂模式在QQ农场游戏中的应用uses
 6抽象工厂模式在QQ农场游戏中的应用   uBackground, uHouse, uKennel, uFence;
 7抽象工厂模式在QQ农场游戏中的应用
 8抽象工厂模式在QQ农场游戏中的应用type
 9抽象工厂模式在QQ农场游戏中的应用  TAbstractFacilitiesFactory = class(TObject)
10抽象工厂模式在QQ农场游戏中的应用  public
11抽象工厂模式在QQ农场游戏中的应用    function CreateBackground: TBackground; virtualabstract;
12抽象工厂模式在QQ农场游戏中的应用    function CreateHouse: THouse; virtualabstract;
13抽象工厂模式在QQ农场游戏中的应用    function CreateKennel: TKennel; virtualabstract;
14抽象工厂模式在QQ农场游戏中的应用    function CreateFence: TFence; virtualabstract;
15抽象工厂模式在QQ农场游戏中的应用  end;
16抽象工厂模式在QQ农场游戏中的应用
17抽象工厂模式在QQ农场游戏中的应用implementation
18抽象工厂模式在QQ农场游戏中的应用
19抽象工厂模式在QQ农场游戏中的应用end.

 

此时若想得到蒙古包系列的背景、房子、狗窝、栅栏,先从抽象的背景、房子、狗窝、栅栏扩展出相应的蒙古包系列的产品。

 

下面是蒙古包系列的背景:

 

代码
 1抽象工厂模式在QQ农场游戏中的应用unit uYurtSeriesBackground;
 2抽象工厂模式在QQ农场游戏中的应用
 3抽象工厂模式在QQ农场游戏中的应用interface
 4抽象工厂模式在QQ农场游戏中的应用
 5抽象工厂模式在QQ农场游戏中的应用uses
 6抽象工厂模式在QQ农场游戏中的应用  uBackground;
 7抽象工厂模式在QQ农场游戏中的应用
 8抽象工厂模式在QQ农场游戏中的应用type
 9抽象工厂模式在QQ农场游戏中的应用  TYurtSeriesBackground = class(TBackground)
10抽象工厂模式在QQ农场游戏中的应用  public
11抽象工厂模式在QQ农场游戏中的应用    procedure Buy; override;
12抽象工厂模式在QQ农场游戏中的应用  end;
13抽象工厂模式在QQ农场游戏中的应用
14抽象工厂模式在QQ农场游戏中的应用implementation
15抽象工厂模式在QQ农场游戏中的应用
16抽象工厂模式在QQ农场游戏中的应用{ TYurtSeriesBackground }
17抽象工厂模式在QQ农场游戏中的应用
18抽象工厂模式在QQ农场游戏中的应用procedure TYurtSeriesBackground.Buy;
19抽象工厂模式在QQ农场游戏中的应用begin
20抽象工厂模式在QQ农场游戏中的应用  inherited;
21抽象工厂模式在QQ农场游戏中的应用  Writeln('购买蒙古包系列的背景 (', Self.ClassName, ')');
22抽象工厂模式在QQ农场游戏中的应用end;
23抽象工厂模式在QQ农场游戏中的应用
24抽象工厂模式在QQ农场游戏中的应用end.

 

蒙古包系列的其他产品代码略。

 

然后从抽象工厂继承一个用于创建蒙古包系列产品的具体工厂:

 

代码
 1抽象工厂模式在QQ农场游戏中的应用unit uYurtSeriesFactory;
 2抽象工厂模式在QQ农场游戏中的应用
 3抽象工厂模式在QQ农场游戏中的应用interface
 4抽象工厂模式在QQ农场游戏中的应用
 5抽象工厂模式在QQ农场游戏中的应用uses
 6抽象工厂模式在QQ农场游戏中的应用  uAbstractFacilitiesFactory, uBackground, uHouse, uKennel, uFence,
 7抽象工厂模式在QQ农场游戏中的应用  uYurtSeriesBackground, uYurtSeriesFence, uYurtSeriesHouse, uYurtSeriesKennel;
 8抽象工厂模式在QQ农场游戏中的应用
 9抽象工厂模式在QQ农场游戏中的应用type
10抽象工厂模式在QQ农场游戏中的应用  TYurtSeriesFactory = class(TAbstractFacilitiesFactory)
11抽象工厂模式在QQ农场游戏中的应用  public
12抽象工厂模式在QQ农场游戏中的应用    function CreateBackground: TBackground; override;
13抽象工厂模式在QQ农场游戏中的应用    function CreateHouse: THouse; override;
14抽象工厂模式在QQ农场游戏中的应用    function CreateKennel: TKennel; override;
15抽象工厂模式在QQ农场游戏中的应用    function CreateFence: TFence; override;
16抽象工厂模式在QQ农场游戏中的应用  end;
17抽象工厂模式在QQ农场游戏中的应用
18抽象工厂模式在QQ农场游戏中的应用implementation
19抽象工厂模式在QQ农场游戏中的应用
20抽象工厂模式在QQ农场游戏中的应用{ TYurtSeriesFactory }
21抽象工厂模式在QQ农场游戏中的应用
22抽象工厂模式在QQ农场游戏中的应用function TYurtSeriesFactory.CreateBackground: TBackground;
23抽象工厂模式在QQ农场游戏中的应用begin
24抽象工厂模式在QQ农场游戏中的应用  Result := TYurtSeriesBackground.Create;
25抽象工厂模式在QQ农场游戏中的应用end;
26抽象工厂模式在QQ农场游戏中的应用
27抽象工厂模式在QQ农场游戏中的应用function TYurtSeriesFactory.CreateFence: TFence;
28抽象工厂模式在QQ农场游戏中的应用begin
29抽象工厂模式在QQ农场游戏中的应用  Result := TYurtSeriesFence.Create;
30抽象工厂模式在QQ农场游戏中的应用end;
31抽象工厂模式在QQ农场游戏中的应用
32抽象工厂模式在QQ农场游戏中的应用function TYurtSeriesFactory.CreateHouse: THouse;
33抽象工厂模式在QQ农场游戏中的应用begin
34抽象工厂模式在QQ农场游戏中的应用  Result := TYurtSeriesHouse.Create;
35抽象工厂模式在QQ农场游戏中的应用end;
36抽象工厂模式在QQ农场游戏中的应用
37抽象工厂模式在QQ农场游戏中的应用function TYurtSeriesFactory.CreateKennel: TKennel;
38抽象工厂模式在QQ农场游戏中的应用begin
39抽象工厂模式在QQ农场游戏中的应用  Result := TYurtSeriesKennel.Create;
40抽象工厂模式在QQ农场游戏中的应用end;
41抽象工厂模式在QQ农场游戏中的应用
42抽象工厂模式在QQ农场游戏中的应用end.

 

至此,蒙古包系列的背景、房子、狗窝、栅栏创建完毕。风车系列的创建同蒙古包系列,代码省略。

如果还有其他系列的产品,比如糖果系列、地中海情趣系列,方法也是一样的。但是如果要增加一个与背景、房子、狗窝、栅栏同级的抽象产品就要修改抽象工厂的接口了。

 

最后,做一个简单的测试:

 

代码
 1抽象工厂模式在QQ农场游戏中的应用unit uTest;
 2抽象工厂模式在QQ农场游戏中的应用
 3抽象工厂模式在QQ农场游戏中的应用interface
 4抽象工厂模式在QQ农场游戏中的应用
 5抽象工厂模式在QQ农场游戏中的应用uses
 6抽象工厂模式在QQ农场游戏中的应用  SysUtils, uAbstractFacilitiesFactory, uBackground, uFence, uHouse, uKennel;
 7抽象工厂模式在QQ农场游戏中的应用
 8抽象工厂模式在QQ农场游戏中的应用type
 9抽象工厂模式在QQ农场游戏中的应用  TTest = class(TObject)
10抽象工厂模式在QQ农场游戏中的应用  public
11抽象工厂模式在QQ农场游戏中的应用    procedure BuyFacilities(aFactory: TAbstractFacilitiesFactory);
12抽象工厂模式在QQ农场游戏中的应用  end;
13抽象工厂模式在QQ农场游戏中的应用
14抽象工厂模式在QQ农场游戏中的应用implementation
15抽象工厂模式在QQ农场游戏中的应用
16抽象工厂模式在QQ农场游戏中的应用{ TTestFactory }
17抽象工厂模式在QQ农场游戏中的应用
18抽象工厂模式在QQ农场游戏中的应用procedure TTest.BuyFacilities(aFactory: TAbstractFacilitiesFactory);
19抽象工厂模式在QQ农场游戏中的应用var
20抽象工厂模式在QQ农场游戏中的应用  aBackground: TBackground;
21抽象工厂模式在QQ农场游戏中的应用  aHouse: THouse;
22抽象工厂模式在QQ农场游戏中的应用  aKennel: TKennel;
23抽象工厂模式在QQ农场游戏中的应用  aFence: TFence;
24抽象工厂模式在QQ农场游戏中的应用begin
25抽象工厂模式在QQ农场游戏中的应用  try
26抽象工厂模式在QQ农场游戏中的应用    aBackground := aFactory.CreateBackground;
27抽象工厂模式在QQ农场游戏中的应用    aHouse := aFactory.CreateHouse;
28抽象工厂模式在QQ农场游戏中的应用    aKennel := aFactory.CreateKennel;
29抽象工厂模式在QQ农场游戏中的应用    aFence := aFactory.CreateFence;
30抽象工厂模式在QQ农场游戏中的应用
31抽象工厂模式在QQ农场游戏中的应用    aBackground.Buy;
32抽象工厂模式在QQ农场游戏中的应用    aHouse.Buy;
33抽象工厂模式在QQ农场游戏中的应用    aKennel.Buy;
34抽象工厂模式在QQ农场游戏中的应用    aFence.Buy;
35抽象工厂模式在QQ农场游戏中的应用  finally
36抽象工厂模式在QQ农场游戏中的应用    FreeAndNil(aBackground);
37抽象工厂模式在QQ农场游戏中的应用    FreeAndNil(aHouse);
38抽象工厂模式在QQ农场游戏中的应用    FreeAndNil(aKennel);
39抽象工厂模式在QQ农场游戏中的应用    FreeAndNil(aFence);
40抽象工厂模式在QQ农场游戏中的应用  end;
41抽象工厂模式在QQ农场游戏中的应用end;
42抽象工厂模式在QQ农场游戏中的应用
43抽象工厂模式在QQ农场游戏中的应用end.

  

代码
 1抽象工厂模式在QQ农场游戏中的应用program pQQFarm;
 2抽象工厂模式在QQ农场游戏中的应用
 3抽象工厂模式在QQ农场游戏中的应用{$APPTYPE CONSOLE}
 4抽象工厂模式在QQ农场游戏中的应用
 5抽象工厂模式在QQ农场游戏中的应用uses
 6抽象工厂模式在QQ农场游戏中的应用  SysUtils,
 7抽象工厂模式在QQ农场游戏中的应用  uAbstractFacilitiesFactory in 'AbstractFactory\uAbstractFacilitiesFactory.pas',
 8抽象工厂模式在QQ农场游戏中的应用  uBackground in 'AbstractFactory\uBackground.pas',
 9抽象工厂模式在QQ农场游戏中的应用  uFence in 'AbstractFactory\uFence.pas',
10抽象工厂模式在QQ农场游戏中的应用  uHouse in 'AbstractFactory\uHouse.pas',
11抽象工厂模式在QQ农场游戏中的应用  uKennel in 'AbstractFactory\uKennel.pas',
12抽象工厂模式在QQ农场游戏中的应用  uYurtSeriesFactory in 'YurtSeriesFactory\uYurtSeriesFactory.pas',
13抽象工厂模式在QQ农场游戏中的应用  uYurtSeriesBackground in 'YurtSeriesFactory\uYurtSeriesBackground.pas',
14抽象工厂模式在QQ农场游戏中的应用  uYurtSeriesHouse in 'YurtSeriesFactory\uYurtSeriesHouse.pas',
15抽象工厂模式在QQ农场游戏中的应用  uYurtSeriesKennel in 'YurtSeriesFactory\uYurtSeriesKennel.pas',
16抽象工厂模式在QQ农场游戏中的应用  uYurtSeriesFence in 'YurtSeriesFactory\uYurtSeriesFence.pas',
17抽象工厂模式在QQ农场游戏中的应用  uWildmillSeriseFactory in 'WildmillSeriseFactory\uWildmillSeriseFactory.pas',
18抽象工厂模式在QQ农场游戏中的应用  uWildmillSeriseBackground in 'WildmillSeriseFactory\uWildmillSeriseBackground.pas',
19抽象工厂模式在QQ农场游戏中的应用  uWildmillSeriseHouse in 'WildmillSeriseFactory\uWildmillSeriseHouse.pas',
20抽象工厂模式在QQ农场游戏中的应用  uWildmillSeriseKennel in 'WildmillSeriseFactory\uWildmillSeriseKennel.pas',
21抽象工厂模式在QQ农场游戏中的应用  uWildmillSeriseFence in 'WildmillSeriseFactory\uWildmillSeriseFence.pas',
22抽象工厂模式在QQ农场游戏中的应用  uTest in 'uTest.pas';
23抽象工厂模式在QQ农场游戏中的应用
24抽象工厂模式在QQ农场游戏中的应用var
25抽象工厂模式在QQ农场游戏中的应用  aFactory: TAbstractFacilitiesFactory;
26抽象工厂模式在QQ农场游戏中的应用  aTest: TTest;
27抽象工厂模式在QQ农场游戏中的应用
28抽象工厂模式在QQ农场游戏中的应用begin
29抽象工厂模式在QQ农场游戏中的应用  try
30抽象工厂模式在QQ农场游戏中的应用    {若想买到蒙古包系列的背景、房子、狗窝、栅栏,恢复本句,注释掉下一句。}
31抽象工厂模式在QQ农场游戏中的应用    //aFactory := TYurtSeriesFactory.Create; 
32抽象工厂模式在QQ农场游戏中的应用    aFactory := TWildmillSeriseFactory.Create;
33抽象工厂模式在QQ农场游戏中的应用
34抽象工厂模式在QQ农场游戏中的应用    aTest := TTest.Create;
35抽象工厂模式在QQ农场游戏中的应用
36抽象工厂模式在QQ农场游戏中的应用    aTest.BuyFacilities(aFactory);
37抽象工厂模式在QQ农场游戏中的应用  finally
38抽象工厂模式在QQ农场游戏中的应用    FreeAndNil(aFactory);
39抽象工厂模式在QQ农场游戏中的应用    FreeAndNil(aTest);
40抽象工厂模式在QQ农场游戏中的应用  end;
41抽象工厂模式在QQ农场游戏中的应用
42抽象工厂模式在QQ农场游戏中的应用  Readln;
43抽象工厂模式在QQ农场游戏中的应用end.

 

测试结果:

 

抽象工厂模式在QQ农场游戏中的应用

 

相关文章:

  • 2021-12-26
  • 2022-12-23
  • 2021-05-06
  • 2022-12-23
  • 2022-01-05
  • 2021-08-12
猜你喜欢
  • 2022-12-23
  • 2021-08-04
  • 2021-04-19
  • 2022-12-23
  • 2021-08-11
  • 2021-12-24
相关资源
相似解决方案