今天学习了建造者模式,写一篇记录一下。
如果你在外面吃饭,发现老板给你放了太多的盐,你一定会很气愤,而其他人吃的却刚刚好,这是因为在炒菜的过程中有时因为一时粗心而失误放多了。麻婆豆腐是大家熟知的家常菜,可是在每个人手下都有不同的味道,因为每个人的做法都不尽相同,虽然都叫麻婆豆腐,却都不是一个东西。我们编写程序的时候可不能这样,要确保每一步都做到,而不会失误忘记了某个地方。大家发现只要是大的连锁餐馆,菜的味道都是差不多的,因为它们对于每一个菜的每一个步骤都是有严格规定的,这样就能确保味道做出来味道大差不差。在写代码的时候也应该把具体的步骤与表示分离,如果想要同样的构建产生不同的对象并且对象足够复杂,那么建造者模式是比较合适的。
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
类图:
四个要素
- 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
- 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
- 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
- 指导类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
- 四要素及类图引自:http://blog.youkuaiyun.com/zhengzhb/article/details/7375966
//Builder接口
package Builder;
public interface Builder
{
abstract void getPartA();
abstract void getPartB();
abstract Product getResult();
}
//建造者
package Builder;
public class ConcreteA implements Builder
{
private Product product=new Product();
@Override
public void getPartA() {
product.add("部件A");
}
@Override
public void getPartB() {
// TODO Auto-generated method stub
product.add("部件B");
}
@Override
public Product getResult() {
// TODO Auto-generated method stub
return product;
}
}
package Builder;
public class ConcreteB implements Builder{
private Product product=new Product();
@Override
public void getPartA() {
// TODO Auto-generated method stub
product.add("部件X");
}
@Override
public void getPartB() {
// TODO Auto-generated method stub
product.add("部件Y");
}
@Override
public Product getResult() {
// TODO Auto-generated method stub
return product;
}
}
//导演类
package Builder;
public class Director {
public void Construct(Builder builder)
{
builder.getPartA();
builder.getPartB();
}
}
//产品类
package Builder;
import java.util.ArrayList;
public class Product
{
private ArrayList<String> list;
public Product()
{
list=new ArrayList<>();
}
public void add(String data)
{
list.add(data);
}
public void show()
{
int i;
for(i=0;i<list.size();i++)
{
System.out.println(list.get(i));
}
}
}
总的来说,建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
这只是用基本代码练习方便理解。
学习的道路还十分长,需要继续努力。