总的来说,虽然同为创建类设计模式,建造者模式比抽象工厂模式多了一个设计者的角色,用于创建复杂产品。适用于产品中属性顺序不同,产生的产品截然不同的情况。下面,首先从较简单的抽象工厂模式开始解释:
1. 抽象工厂模式
- 抽象产品接口;
- 具体产品类;
- 抽象工厂接口;
- 具体工厂类;
- 客户端;
注意理解产品族和产品等级(结构)的关系,抽象工厂模式就是为了根据客户的指令,创建一个产品族(相互之间有关联或者依赖关系)的产品,不会发生同一个产品族中存在别族产品的情况。
//1. 抽象产品接口
public interface A(){
//产品属性和方法
}
public interface B(){
//产品属性和方法
}
//2. 具体产品类,实现抽象产品接口,通常不止一种产品;
public class ProductA implements A{
//具体产品的属性和方法,除了实现抽象产品的接口,还可以有自己的特有属性和方法
}
public class ProductB implements B{
//具体产品的属性和方法,除了实现抽象产品的接口,还可以有自己的特有属性和方法
}
//3. 抽象工厂接口,为何要有这个抽象工厂接口呢?
//为了将不同的产品匹配起来,这个接口中所定义的方法不是随意堆砌的,是一系列相关或者相互依赖的方法!
public interface AbstractFac{
public ProductA createA();
public ProductB createB();
}
//4. 具体工厂类,具体实现匹配的各产品
public class FacA implements AbstractFac{
//具体实现抽象工厂中的方法
}
//5. 客户端或者加入一个工程师角色
2. 建造者模式
而对于建造者模式,突出的是建造者的角色
1. 产品类(抽象然后实现或者直接实现都可以);
2. 抽象工厂接口;
3. 具体工厂;
4. 建造者角色(一样的产品类,其中属性的顺序或者方法的顺序不同,产生的效果不同;那么就需要使用一个设计建造者的角色去体现);
5. 客户端
//1. 产品类,通常是复杂对象
public class Product{
//有不止一个属性或者方法;颠倒执行顺序,效果不同;
}
//2. 抽象工厂接口
public interface AbstractFac{
//...
}
//3. 具体工厂类
public class Fac implements AbstractFac{
//返回一个实现了的产品对象;
}
//4. 建造者
public class Designer{
public Design(){}
public void design(AbstractFac af){
af.methodA();
//设计不同的顺序,产生不同的效果
}
}
public class Client{
public static void main(String[] args){
Fac fac = new Fac();
Designer designer = new Disigner();
designer.design(fac);
Product product = fac.getProduct();
//...使用product
}
}