声明:虽然本文是说的Delphi设计模式,但是设计模式本身并不局限于某一种语言,只是因为我本人对Delphi熟悉一些,所以是用Delphi来表示。
该模式应用场景:当干某一个事情需要经过多个复杂的步骤的时候,而且某一个步骤可能因为时间、地点、人物等条件的不同,所需要的方
也不同。举例说明:本文以生产手机来说明。手机的品牌虽然有很多,但是手机的组成部分却是一样的,比如芯片,屏幕、电池、摄像头等,组装
的时候,也是按照一定的步骤、顺序组装的,每一个部件缺一不可,这些是相同点(有可能不同的厂家组装顺序不一样,不用过多纠结这一点);
更大的差异来源于配件,有的厂家自己生产,有的却是去采购,采购来源还不一样。一下是具体代码:
//建造者模式相关类单元
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
//手机生产接口
IPhoneInterface = interface
procedure getScreen;
procedure getChip;
procedure getBattery;
procedure getCamera;
procedure Assemble;
end;
//手机厂商A
TPhoneA = class(TInterfacedObject,IPhoneInterface)
public
procedure getScreen;
procedure getChip;
procedure getBattery;
procedure getCamera;
procedure Assemble;
end;
//手机厂商B
TPhoneB = class(TInterfacedObject,IPhoneInterface)
public
procedure getScreen;
procedure getChip;
procedure getBattery;
procedure getCamera;
procedure Assemble;
end;
//控制手机生产类,避免手机生产过程中某一个工序漏了,组装前其他手机部件
//必须全部到位
TManageProduction = class
private
FPhone : IPhoneInterface;
public
procedure production;
constructor Create(Phone : IPhoneInterface);
end;
implementation
uses uMyCommon;
procedure TPhoneA.getScreen;
begin
Writelog('生产屏幕');
end;
procedure TPhoneA.getChip;
begin
Writelog('生产芯片');
end;
procedure TPhoneA.getBattery;
begin
Writelog('生产电池');
end;
procedure TPhoneA.getCamera;
begin
Writelog('生产摄像头');
end;
procedure TPhoneA.Assemble;
begin
Writelog('开始组装');
end;
procedure TPhoneB.getScreen;
begin
Writelog('采购屏幕');
end;
procedure TPhoneB.getChip;
begin
Writelog('采购芯片');
end;
procedure TPhoneB.getBattery;
begin
Writelog('采购电池');
end;
procedure TPhoneB.getCamera;
begin
Writelog('采购摄像头');
end;
procedure TPhoneB.Assemble;
begin
Writelog('开始组装');
end;
constructor TManageProduction.Create(Phone: IPhoneInterface);
begin
FPhone := Phone;
end;
procedure TManageProduction.production;
begin
FPhone.getScreen;
FPhone.getChip;
FPhone.getBattery;
FPhone.getCamera;
FPhone.Assemble;
end;
end.
//调用单元
procedure TForm1.Button1Click(Sender: TObject);
var
phone :IPhoneInterface;
manage : TManageProduction;
begin
phone := TPhoneA.Create;
manage := TManageProduction.Create(phone);
manage.production;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
phone :IPhoneInterface;
manage : TManageProduction;
begin
phone := TPhoneB.Create;
manage := TManageProduction.Create(phone);
manage.production;
end;
//本文举例比较极端,A厂家的配件完全自研,B厂家全部采购,不过道理却是相通的