一、类型
建造者模式
二、定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到它的子类。
三、参与者
- Product(产品接口):所需创建对象的接口,有时也会使用抽象类。
- ConcreteProduct(产品实现):实现
Product
接口 - Creator(工厂接口):用来声明一个工厂方法,这个方法用来返回一个
Product
类型的对象。Creator
也可以定义一个工厂方法的默认实现,用于返回一个默认的ConcreteProduct
对象。有时也可以使用抽象类。 - ConcreteProduct(工厂实现):重新定义工厂方法以返回一个
ConcreteProduct
实例。
四、类图
五、示例
这里规定每个产品都有一个自己的专属工厂,例如苹果有苹果工厂,梨子有梨子工厂,XX 水果有自己的 XX 工厂,我们让各个工厂来决定创建什么水果。
1、Product
/**
* 定义一个水果接口Fruit
*/
public interface Fruit {
}
2、ConcreteProduct
苹果
/**
* Fruit接口具体的实现类,Apple
*/
public class Apple implements Fruit {
}
梨子
/**
* Fruit接口具体的实现类,Pear
*/
public class Pear implements Fruit {
}
3、Creator
/**
* 工厂接口
*/
public interface FruitFactory {
Fruit getFruit();
}
4、ConcreteProduct
苹果工厂
public class AppleFactory implements FruitFactory {
@Override
public Fruit getFruit() {
// AppleSeed appleSeed = new AppleSeed(); // 苹果种子
// Sunshine sunshine = new Sunshine(); // 阳光
// Manure manure = new Manure(); // 肥料
// Water water = new Water(); // 水分
return new Apple();
}
}
梨子工厂
public class PearFactory implements FruitFactory {
@Override
public Fruit getFruit() {
// AppleSeed appleSeed = new AppleSeed(); // 苹果种子
// Sunshine sunshine = new Sunshine(); // 阳光
// Manure manure = new Manure(); // 肥料
// Water water = new Water(); // 水分
return new Pear();
}
}
最终调用
public class User {
public static void main(String[] args) {
// 获取苹果
AppleFactory appleFactory = new AppleFactory();
Fruit apple = appleFactory.getFruit();
// 获取梨子
PearFactory pearFactory = new PearFactory();
Fruit pear = pearFactory.getFruit();
}
}
六、适用情况
- 需要生成复杂对象时。我们在创建复杂对象的过程中,可以把一些相关的细节封装在工厂中,调用者可以不用知道这些细节,降低创建复杂对象的难度。
- 需要解耦时。如果调用者自己在创建对象时,可能会增加与其它类的依赖关系,这时可以考虑使用工厂模式。
- 需要有较强的扩展性时。工厂方法模式符合开闭原则(对修改关闭,对扩展开放),可以很轻松的扩展相关其它产品种类。