建造者模式属于设计模式的创建型模式,其使用多个简单的对象一步一步构建成一个复杂的对象,其中使用了接口,抽象和继承。
关于设计者模式的思想有:
- 通过抽象类实现接口,再让普通类继承抽象类,对特定方法的读取;
- 复杂的构建与表示分离,建立结构容器类和制造类;
- 工厂模式的区别是:建造者模式更加关注零件与零件装配的顺序。
思路:
- 设计接口,其作用是类所遵循的规范;
- 设计抽象类和普通类来实现接口;
- 抽象类和其继承类的功能类似于工厂模式;
具体设计:对每天吃的:有米饭+肉和粥+包子两种组合。表现出来的就是晚饭(结构),但内容可以不一样。
- 设计一个(总)接口Imeal,有String name()和Eat eat()抽象方法,一个接口Eat,有String eat()抽象方法
- 对Eat接口实现,两个类,一个是Chopsticks(筷子),另一个是Spoon(勺子),都重写eat方法,返回字符串。
- 建立两个抽象类实现接口Imeal,重写Eat eat()方法,返回new Chopsticks和new Spoon;
- 建立米饭Rice和Meat两个类继承Chopsticks,重写name方法;建立Porridge和Bread继承Spoon类,重写name方法;都返回字符串;
- 建立表现类Meal,类内声明一个接口数据类型数组来存放组合,一个show方法;
- 建立制造类MealProducer,两个方法分别往Meal型对象添加对象,返回对象;
- 建立public类BuilderPatternDemo实现
具体代码如下:
import java.util.ArrayList;
import java.util.List;
interface Imeal{
String name();
Eat eat();
}
interface Eat{
String eat();
}
class Chopstics implements Eat{
public String eat(){
return "Chopstics";
}
}
class Spoon implements Eat{
public String eat(){
return "Spoon";
}
}
abstract class Chopstics1 implements Imeal{
public Eat eat(){
return new Chopstics();
}
}
abstract class Spoon1 implements Imeal{
public Eat eat(){
return new Spoon();
}
}
class Rice extends Chopstics1{
public String name(){
return "Rice";
}
}
class Meat extends Chopstics1{
public String name(){
return "Meat";
}
}
class Porridge extends Spoon1{
public String name(){
return "Porridge";
}
}
class Bread extends Spoon1{
public String name(){
return "Bread";
}
}
class Meal{
private List<Imeal> imeals=new ArrayList<Imeal>();
public void addImeal(Imeal imeal){
imeals.add(imeal);
}
void showImeals(){
for(Imeal imeal:imeals){
System.out.print("Imeal:"+imeal.name());
System.out.println(",:"+imeal.eat().eat());
}
}
}
class MealBuilder{
Meal prepareRiceMeal(){
Meal meal=new Meal();
meal.addImeal(new Rice());
meal.addImeal(new Meat());
return meal;
}
Meal preparePorridgeVegMeal(){
Meal meal=new Meal();
meal.addImeal(new Porridge());
meal.addImeal(new Bread());
return meal;
}
}
public class BuilderPatternDemo {
public static void main(String[] args) {
MealBuilder mealBuilder=new MealBuilder();
Meal riceMeal=mealBuilder.prepareRiceMeal();
System.out.println("Rice Meal");
riceMeal.showImeals();
Meal porridgeMeal=mealBuilder.preparePorridgeVegMeal();
System.out.println("porridge Meal");
porridgeMeal.showImeals();
}
}
输出如下:
Rice Meal
Imeal:Rice,:Chopstics
Imeal:Meat,:Chopstics
porridge Meal
Imeal:Porridge,:Spoon
Imeal:Bread,:Spoon
其中,注意的imeal.eat().eat()的含义是第一个eat是抽象类中的方法,返回的是new对象,再通过返回的new对象调用其对象方法。