设计模式之抽象工厂模式

刚看到抽象工厂模式,发现抽象工厂模式是很想的,抽象工厂模式定义如下:为创建一组相关或相互依赖的对象提供一个接口,而且不需要指定它们的具体类


抽象工厂模式的通用类图如下:




每一个模式都是针对一定问题的解决方案。抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构


下面用一个汽车制造的例子来说一下抽象工厂模式


汽车制造类图如下:




汽车的制造主要有:发动机、轮胎、车门、座椅等等,本例之介绍发动机和轮胎的制造

现在要生产两种车辆:宝马和奔驰,宝马和奔驰的发动机和轮胎都有各自的要求,所以提取抽象,即发动机Engine和轮胎抽象类Tire,具体的区别交由各自的实现类,根据抽象工厂模式的定义,既然存在不同的产品,那么就需要不同的工厂负责生产。


具体代码如下:


/**
 * 发动机抽象类
 *
 */
public abstract class Engine {

    //抽象逻辑定义
}


/**
 *宝马汽车的发动机 
 *
 */
public class BMWEngine extends Engine {

}

/**
 * 奔驰汽车的发动机
 *
 */
public class BenzEngine extends Engine {

}

/**
 * 发动机工厂的抽象类
 *
 */
public abstract class EngineFactory {

    public abstract Engine createEngine();
}

/**
 * 宝马发动机工厂类
 *
 */
public class BMWEngineFactory extends EngineFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.EngineFactory#createEngine()
     */
    @Override
    public Engine createEngine() {
        // TODO Auto-generated method stub
        return new BMWEngine();
    }

}

/**
 * 奔驰发动机的工厂类
 *
 */
public class BenzEngineFactory extends EngineFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.EngineFactory#createEngine()
     */
    @Override
    public Engine createEngine() {
        // TODO Auto-generated method stub
        return new BenzEngine();
    }

}

/**
 *汽车轮胎的抽象类 
 *
 */
public abstract class Tire {

    //抽象逻辑定义,例如生产轮胎的尺寸,材质等等
}

/**
 * 宝马轮胎
 *
 */
public class BMWTire extends Tire {

}

/**
 * 
 *奔驰轮胎
 */
public class BenzTire extends Tire {

}

/**
 * 轮胎的抽象工厂类
 *
 */
public abstract class TireFactory {

    public abstract Tire createTire();
}

/**
 * 宝马轮胎工厂类
 *
 */
public class BMWTireFactory extends TireFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.TireFactory#createTire()
     */
    @Override
    public Tire createTire() {
        // TODO Auto-generated method stub
        return new BMWTire();
    }

}

/**
 * 奔驰轮胎工厂类
 *
 */
public class BenzTireFactory extends TireFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.TireFactory#createTire()
     */
    @Override
    public Tire createTire() {
        // TODO Auto-generated method stub
        return new BenzTire();
    }

}

public class CarEngineer {
    
    private String carType;

    private Engine engine;

    private Tire tire;

    private EngineFactory engineFactory;

    private TireFactory tireFactory;
    
    public void createCar(){
        
        if("BMW".equalsIgnoreCase(carType)){
            engineFactory=new BMWEngineFactory();
            
            engine=engineFactory.createEngine();
            
            tireFactory=new BMWTireFactory();
            
            tire=tireFactory.createTire();
        }
        
        if("Benz".equalsIgnoreCase(carType)){
            engineFactory=new BenzEngineFactory();
            
            engine=engineFactory.createEngine();
            
            tireFactory=new BenzTireFactory();
            
            tire=tireFactory.createTire();
        }
    }
}


抽象工厂模式的优点:

良好的封装,客户端不需要关心具体的实现类,客户端只需要关注接口即可


抽象工厂模式的缺点:

不易扩展新产品,例如上面汽车制造的例子,如果现在增加一个车门的制造,那么我们需要定义一个车门的抽象类,定义宝马和奔驰的车门实现类,增加车门的抽象工厂类,定义宝马和奔驰车门生产的工厂类,如果不止这两种车呢?想想吧,我们需要写多少类



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值