码迷,mamicode.com
首页 > 其他好文 > 详细

创建型设计模式(二)抽象工厂模式

时间:2019-07-21 18:51:14      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:car   颜色   ace   div   品牌   case   cas   etc   需要   

一、一句话背景

假如我是一个汽车经销商,那我不光是卖车,也得卖相关的配件吧,比如润滑油,轮胎之类的,那我能不能整一个抽象的工厂,我需要啥直接告诉这个抽象工厂,具体生产哪一类产品让这个抽象工厂自己去对接,这样我不管需要啥都只用找这个抽象工厂的负责人就可以,而不用找每一类具体产品工厂的负责人,我可就省事多了~

二、使用场景

调用一整套产品族的场景。

如:参加不同类型的抽奖活动,QQ换皮肤

三、模型分析

生产流水线:接口,定义生产具体产品的方法

具体产品的生产流水线:类,定义生产具体特征(颜色,品牌等)产品的方法,生产流水线接口的具体实现

工厂:类,需要根据客户需求调用不同的流水线来生产具体产品

抽象工厂:抽象类,负责对接各类产品的工厂

四、代码分析

生产流水线

/**
 * 创建一个生产流水线接口,定义生产汽车的方法
 */
public interface CarProductionLine{
    //生产汽车的方法
    void produceCar();
}
/**
 * 创建一个生产流水线接口,定义生产轮胎的方法
 */
public interface TireProductionLine{
    //生产轮胎的方法
    void produceTire();
}

 

各个品牌汽车的生产流水线(具体产品的生产流水线)

/**
 * 宝马车生产流水线
 */
public class BmwProductionLine implements CarProductionLine {

    @Override
    public void produceCar() {
        //实现生产流水线接口定义的方法,生产宝马车
        System.out.println("整台宝马来开~");
    }
}
/**
 * 奔驰车生产流水线
 */
public class BenzProductionLine implements CarProductionLine {

    @Override
    public void produceCar() {
        //实现生产流水线接口定义的方法,生产奔驰车
        System.out.println("整台奔驰来开~");
    }
}
/**
 * 奥迪车生产流水线
 */
public class AudiProductionLine implements CarProductionLine {

    @Override
    public void produceCar() {
        //实现生产流水线接口定义的方法,生产奥迪车
        System.out.println("整台奥迪来开~");
    }
}

各个品牌轮胎的生产流水线(具体产品的生产流水线)

/**
 * 米其林轮胎生产流水线
 */
public class MQLProductionLine implements TireProductionLine {

    @Override
    public void produceTire() {
        //实现生产流水线接口定义的方法,生产米其林轮胎
        System.out.println("生产米其林轮胎~");
    }
}
/**
 * 固特异轮胎生产流水线
 */
public class GTYProductionLine implements TireProductionLine {

    @Override
    public void produceTire() {
        //实现生产流水线接口定义的方法,生产固特异轮胎
        System.out.println("生产固特异轮胎~");
    }
}

 

汽车工厂(工厂)

/**
 * 汽车生产工厂
 */
public class CarFactory extends AbstractFactory {

    //使用 getCar 方法调用不同的生产线
    @Override
    public CarProductionLine getCar(String carBrand) {
        if (carBrand == null) {
            return null;
        }
        if (carBrand.equalsIgnoreCase("bmw")) {
            return new BmwProductionLine();
        } else if (carBrand.equalsIgnoreCase("benz")) {
            return new BenzProductionLine();
        } else if (carBrand.equalsIgnoreCase("audi")) {
            return new AudiProductionLine();
        }
        return null;
    }

    @Override
    public TireProductionLine getTire(String tireBrand) {
        return null;
    }
}

 

轮胎工厂(工厂)

/**
 * 轮胎生产工厂
 */
public class TireFactory extends AbstractFactory {

    @Override
    public CarProductionLine getCar(String carBrand) {
        return null;
    }

    //使用 getTire 方法调用不同的生产线
    @Override
    public TireProductionLine getTire(String tireBrand) {
        if (tireBrand == null) {
            return null;
        }
        if (tireBrand.equalsIgnoreCase("mql")) {
            return new MQLProductionLine();
        } else if (tireBrand.equalsIgnoreCase("gty")) {
            return new GTYProductionLine();
        }
        return null;
    }
}

 

 抽象工厂(抽象工厂)

/**
 * 抽象工厂,定义了调用工厂的方法
 */
public abstract class AbstractFactory {
    public abstract CarProductionLine getCar(String carBrand);

    public abstract TireProductionLine getTire(String tireBrand);
}

 

工厂生成器(模拟抽象工厂负责人的工作)

/**
 * 工厂生成器
 */
public class FactoryProducer {
    public static AbstractFactory getFactory(String choice) {
        if (choice.equalsIgnoreCase("car")) {
            return new CarFactory();
        } else if (choice.equalsIgnoreCase("tire")) {
            return new TireFactory();
        }
        return null;
    }
}

 

创建型设计模式(二)抽象工厂模式

标签:car   颜色   ace   div   品牌   case   cas   etc   需要   

原文地址:https://www.cnblogs.com/riches/p/11200185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!