所谓创建者模式,他的意思就是,将一个复杂对象的创建过程,抽象出共性的创建流程和差异性的具体创建属性,将它们分离出来,我们按照共性的创建流程创建,在差异性的具体创建属性中进行差异的操作,从而创建出具有相同结构或者流程 的不同产品。创建者模式,一般由四部分组成,product产品类,builder抽象创建者类,createbuilder创建者类,director导演类四个角色组成。
具体来说,product类是我们具体最后要组建的实体产品,他的结构比较复杂,是我们创建的最终目的。
builder类,正如他的名字一样,是个抽象类,是创建者,他主要规定了组成产品的各个部分分别是哪些部分,不管具体实现,是规定一个创建的规范。一般这个类可以由两个大的部分组成,一部分管理各个部分的设置,一个部分是返回一个创建成功的产品。
createbuilder类,是builder的具体实现类,他实现了builder的所有抽象函数,提供了给具体的product设定具体的值的接口,同时返回一个product对象。调用这样一个builder可以进行一个product的属性设置,同时得到一个product对象。
director类,是对createbuilder类的进一步封装。diretor类似工厂模式中的工厂,给外部提供各种各样的产品product。directot中直接打交道的对象是createbuilder对象,通过调用createbuilder对象的设置函数和返回函数进行product的设置和product的返回。
下面我们通过一个例子来说明创建者模式。我们都知道一套套装,应该由头饰,衣服,裤子三个部分组成,现在我们使用创建者模式来模拟一下这个实例。
首先我们先将我们需要得到的产品类定义好,这里 我们简单的把他定义为一个实体类(真实场景中可能是由某个抽象类实现了某些接口而来的,这个部分可以再好好设计一下):
class Suit
{
private String header;
private String cloth;
private String pants;
public void setHeader(String h){ header=h;}
public void setCloth(String c){ cloth=h;}
public void setPants(String p){ pants=h;}
pulbic void show()
{
system.out.println(" header:"+header+"\ncloth:"+cloth+"\npants:"+pants);
}
}
我们定义一个接口来充当builder的角色,这个接口中规定了我们创建一套套装的流程。
interface tailor
{
public abstract void setHeader();
public abstract void setCloth();
public abstract void setPants();
public abstract Suit getSuit();
}
接下来我们定义一个createbuilder来具体实现生产的过程。
class SuitBuilder implements tailor{
private Suit suit=new Suit();
@Override
public Suit getSuit() {
return suit;
}
@Override
public void setHeader(String h) {
suit.setHeader(h);
}
@Override
public void setCloth(String c) {
suit.setCloth(c);
}
@Override
public void setPants(String p) {
suit.setPants(p);
}
}
最后一步,我们创建一个director来获取不同的suit对象。
class SuitDirector
{
private Builder builder=new SuitBuilder();
public Suit getDressSuit()
{
builder.setCloth("dress");
builder.setHeader("green hat");
builder.setPants("dress");;
return builder.getSuit();
}
public Suit getPantsSuit()
{
builder.setCloth("suit");
builder.setHeader("hat");
builder.setPants("jeans");
return builder.getSuit();
}
}
在main函数中,比如我们想得到一个裙子套装,我们就可以如下调用:
public static void main(String arg [])
{
SuitDirector di=new SuitDirector();
di.getDressSuit().show();
}
显示结果:
header:green hat
cloth:dress
pants:dress