设计模式GOF23——抽象工厂模式

抽象工厂模式(Abstract Factory)是创建者模式的一种,是一种负责创建对象的模式。

模式的职责

抽象工厂算是工厂模式的一种,因为逻辑和实现相对复杂一些,所以在设计模式中不少说明都是分开说明的。
抽象工厂也是为了实现对象创建和对象使用的分离。工厂模式虽然已经实现了这一需求,但是还是不够彻底。比如:如果创建的对象不是一个对象,而已一系列对象的时候,普通的工厂模式就会无能为力了。这个时候就需要抽象工厂模式。
简而言之,抽象工厂模式的职责是创建产品族和使用产品族的分离。是工厂模式的一种特殊情况。

模式的实现

创建一个工厂对象的抽象类,定义产品族的基本信息和方法,将产品族的创建封装在实现类的相应方法中。对于对象的创建和管理,可以使用相应类的抽象接口来实现。
抽象工厂不可以增加产品,但可以增加产品族。

//引擎接口,汽车产品族的对象之一
public interface Engine {
    void start();
}
//豪华版引擎类
public class LuxuryEngine implements Engine{

    public void start() {
        //奢侈版引擎的方法实现
    }

}
//低端版引擎类
public class LowEngine implements Engine{

    public void start() {
        //低端版引擎的方法实现
    }

}
public interface Seat {
    void seat();
}
//豪华版车座类
public class LuxurySeat implements Seat{

    public void seat() {
        //奢侈版车座的方法实现
    }

}
//低端版车座类
public class LowSeat implements Seat{

    public void seat() {
        //低端版车座的方法实现
    }

}
//奢侈版汽车的创建类,实现奢侈版汽车的创建
public class LuxuryCar implements CarFactory{
//奢侈版汽车的引擎创建
    public Engine createEngine() {
        Engine e = new LuxuryEngine();
        return e;
    }
//奢侈版汽车的车座创建
    public Seat createSeat() {
        Seat s = new LuxurySeat();
        return s;
    }

}
//低端版汽车的创建类,实现低端版汽车的创建
public class LuxuryCar implements CarFactory{
//低端版汽车的引擎创建
    public Engine createEngine() {
        Engine e = new LowEngine();
        return e;
    }
//低端版汽车的车座创建
    public Seat createSeat() {
        Seat s = new LowSeat();
        return s;
    }

}

低端版和奢侈版算是两种不同的产品组,通过对创建工厂的抽象,使得不同的产品组的编写变得容易一些。
类似的一套产品的创建和更换可以用抽象工厂方式来做到,比如类似QQ空间换皮肤,可以通过抽象工厂模式变得容易些。

工厂模式的总结

简单工厂模式适合创建对象但扩展的话不符合开闭原则。
工厂模式符合开闭原则,但是会创建过多的类。
抽象工厂模式是对产品族的创建和控制分离的特殊状况的工厂模式。
工厂模式在实际应用中一般不会单独出现,往往会和其他的方式结合起来。
工厂模式的一些应用场景:
1. JDK中Calendar的getInstance方法
2. JDBC中Connection对象的获取。
3. Hibernate中SessionFactory创建Session。
4. Spring中IOC容器创建管理bean对象。
5. XML解析时DocumentBuliderFactory创建解析对象。
6. 反射中Class对象的newInstance
其实工厂模式的应用还是比较广泛的,一般一些需要创建XXXFactory的都属于工厂模式。

你可能感兴趣的:(设计模式GOF23)