设计模式之——抽象工厂(AbstractFactory)
抽象工厂模式定义
为访问类(客户端)提供创建一组相关或相互依赖对象的接口,且访问类(客户端)无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式的优点
- 有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象;
- 分离了具体的类。客户通过抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中;
- 增加一个新的产品族时不需要修改原代码,满足开闭原则。
抽象工厂模式的缺点
- 难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品;
- 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
抽象工厂模式的实现
定义一个抽象工厂
interface Farm
{
public Animal newAnimal();
public Plant newPlant();
}
定义抽象动物类
//抽象动物类
interface Animal
{
public void run();
}
定义抽象植物类
//抽象产品:植物类
interface Plant
{
public void show();
}
定义两个具体动物类
//马
class Horse implements Animal{
public void run(){
System.out.println("马跑了");
}
}
//猪
class Pig implements Animal{
public void run(){
System.out.println("猪跑了");
}
}
定义两个具体植物类
//Flower
class Flower implements Plant{
public void show(){
System.out.println("花开了");
}
}
//蔬菜
class Vegetables implements Plant{
public void show(){
System.out.println("蔬菜熟了");
}
}
定义两个具体工厂
class Farm1 implements Farm{
public Animal newAnimal(){
return new Horse();
};
public Plant newPlant(){
return new Flower();
};
}
class Farm2 implements Farm{
public Animal newAnimal(){
return new Pig();
};
public Plant newPlant(){
return new Vegetables();
};
}
测试
public class TestFactory{
public static void main(String[] args){
Farm farm1= new Farm1();
Farm farm2= new Farm2();
farm1.newAnimal().run();
farm1.newPlant().show();
farm2.newAnimal().run();
farm2.newPlant().show();
}
}
结果
马跑了
花开了
猪跑了
蔬菜熟了
抽象工厂模式的使用场景
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 需要创建的对象是一系列相互关联或相互依赖的产品族时,如农场中的马、猪、蔬菜等。
- 提供一个产品类库,而只想显示它们的接口而不是实现时。