夏天来了,西瓜上市了;
在简单工厂模式中,由于只有一个小贩,为了引进西瓜他只好对自己的工厂进行了修改;
在工厂方法模式中,由于每个小贩负责一种水果,只需要再引进一个卖西瓜的小贩就行了,对其他小贩的销售不会造成影响 。
下面先看看在简单工厂模式中是怎么做的:
1、在工厂类和水果类单元文件中,引入一个新的西瓜类(这里是扩展,不会影响到已有的代码)
| //============================================================================= 类_西瓜 = class(tinterfacedobject, 接口_水果) function 提示():string; function 被评价():string; end; {****** 类_西瓜 ******} function 类_西瓜.提示():string; begin result:='刚上市的沙瓤大西瓜,2元钱一斤!'; end; function 类_西瓜.被评价():string; begin result:='靠,被骗了,根本没熟!'; end; //============================================================================= |
2、在工厂类和水果类单元文件中,修改小贩的工厂方法(这里是修改,已经违反了“开闭原则”)
| //============================================================================= class function 工厂类_小贩.工厂(水果名:string): 接口_水果; begin if(水果名='苹果')then result:=类_苹果.create() else if(水果名='葡萄')then result:=类_葡萄.create() else if(水果名='草莓')then result:=类_草莓.create() //请注意,下面这条语句是新加上去的,工厂被修改了!!!! else if(水果名='西瓜')then result:=类_西瓜.create(); end; //============================================================================= |
3、在窗体单元文件中,添加一个新的事件处理过程(这里是扩展,不会影响到已有的代码)
| //============================================================================= radiobutton4: tradiobutton; procedure radiobutton4click(sender: tobject); procedure tform1.radiobutton4click(sender: tobject); begin 交易('西瓜'); end; //============================================================================= |
下面再看看在工厂方法模式中是怎么做的:
1、这一步和在简单工厂模式中做的一样,在工厂类和水果类单元文件中,引入一个新的西瓜类(这里是扩展,不会影响到已有的代码)
| //============================================================================= 类_西瓜 = class(tinterfacedobject, 接口_水果) function 提示():string; function 被评价():string; end; {****** 类_西瓜 ******} function 类_西瓜.提示():string; begin result:='刚上市的沙瓤大西瓜,2元钱一斤!'; end; function 类_西瓜.被评价():string; begin result:='靠,被骗了,根本没熟!'; end; //============================================================================= |
2、区别就在这里了,在工厂类和水果类单元文件中,引入一个新的西瓜小贩类(这里是扩展,不会影响到已有的代码)
| //============================================================================= 类_西瓜小贩 = class(tinterfacedobject, 接口_小贩) function 工厂(): 接口_水果; end; {***** 类_西瓜小贩 *****} function 类_西瓜小贩.工厂(): 接口_水果; begin result:=类_西瓜.create() end; //============================================================================= |