抽象工厂模式

  工厂方法模式不清楚可以先查看上一篇博文工厂方法模式,这里先看一个工厂方法模式的例子:
抽象产品类( 汽车总称):

public interface Car
{
        //获取车的品牌
        public void getCarType();
        // 对车进行喷漆
        public abstract void paint();
}

具体产品类(奥迪):

public class AudiCar implements Car
{

    @Override
    public void getCarType()
    {
        System.out.println("车的品牌为奥迪");

    }

    @Override
    public void paint()
    {
        System.out.println("对车喷奥迪专用漆");

    }

}

具体产品类(奔驰):

public class BenzCar implements Car
{

    @Override
    public void getCarType()
    {
        System.out.println("车的品牌为奔驰");

    }

    @Override
    public void paint()
    {
        System.out.println("对车喷奔驰专用漆");

    }

}

具体产品类(保时捷):

public class PorscheCar implements Car
{

    @Override
    public void getCarType()
    {
        System.out.println("车的品牌为保时捷");

    }

    @Override
    public void paint()
    {
        System.out.println("对车喷保时捷专用漆");

    }

}

抽象工厂类(AbstractCarFatory):

public abstract class AbstractCarFatory
{
    public abstract <T extends Car> T createCar(Class<T> cl);
}

具体工厂类(CarFactory ):

public class CarFactory extends AbstractCarFatory
{

    @SuppressWarnings("unchecked")
    @Override
    public <T extends Car> T createCar(Class<T> cl)
    {
        // TODO Auto-generated method stub
        Car  car = null;
        try{
            car = (T)Class.forName(cl.getName()).newInstance();
        }catch(Exception e)
        {
            e.printStackTrace();
        }
        return (T)car;
    }

}

场景类(Worker):

public class Worker
{
    public static void main(String[] args)
    {
        //汽车加工厂
        AbstractCarFatory  carFatory  = new CarFactory();
        //开始造奥迪
        System.out.println("=============开始造奥迪===============");
        AudiCar audiCar  = carFatory.createCar(AudiCar.class);
        audiCar.getCarType();
        audiCar.paint();
        //开始造奔驰
        System.out.println("=============开始造奔驰===============");
        BenzCar benziCar  = carFatory.createCar(BenzCar.class);
        benziCar.getCarType();
        benziCar.paint();
        //开始造保时捷
        System.out.println("=============开始造保时捷===============");
        PorscheCar porscheCar  = carFatory.createCar(PorscheCar.class);
        porscheCar.getCarType();
        porscheCar.paint();
    }
}

车的生产流程执行结果:

=============开始造奥迪===============
车的品牌为奥迪
对车喷奥迪专用漆
=============开始造奔驰===============
车的品牌为奔驰
对车喷奔驰专用漆
=============开始造保时捷===============
车的品牌为保时捷
对车喷保时捷专用漆

假设现在业务发生变化,需要生产不同颜色的车,此时我们需要进行改造,代码如下:

汽车总类(Car类):

public interface Car
{
        //获取车的品牌
        public void getCarType();
        // 对车进行喷漆
        public void paint();
        //喷漆的颜色
        public void getColor();
}

抽象汽车类(Audi,Benz,Porsche下面都有白色,黑色,红色之分,所以把Audi,Benz,Porsche抽象出来)

public abstract class AbstractBenzCar implements Car
{
    @Override
    public void getCarType()
    {
        System.out.println("车的品牌为奔驰");

    }

    @Override
    public void paint()
    {
        System.out.println("对车喷奔驰专用漆");

    }
}
public abstract class AbstractAudiCar implements Car
{
    @Override
    public void getCarType()
    {
        System.out.println("车的品牌为奥迪");

    }

    @Override
    public void paint()
    {
        System.out.println("对车喷奥迪专用漆");

    }
}

抽象汽车工厂(CarFactory)

public interface CarFactory
{
        //生产黑色汽车
        public Car creatRedCar();
        //生产白色汽车
        public Car creatWihteCar();
        //生产黑色汽车
        public Car creaBlackCar();
}

具体汽车工厂类(audi汽车工厂)

public class AudiFactory implements CarFactory
{
    //生产红色Audi
    @Override
    public Car creatRedCar()
    {
        // TODO Auto-generated method stub
        return new RedAudiCar();
    }
    //生产白色Audi
    @Override
    public Car creatWihteCar()
    {
        // TODO Auto-generated method stub
        return new WhiteAudiCar();
    }
    //生产黑色Audi
    @Override
    public Car creaBlackCar()
    {
        // TODO Auto-generated method stub
        return new BlackAudiCar();
    }

}

具体汽车工厂类(Benz汽车工厂)

public class BenzFactory implements CarFactory
{
    //生产红色Audi
    @Override
    public Car creatRedCar()
    {
        // TODO Auto-generated method stub
        return new RedBenzCar();
    }
    //生产白色Audi
    @Override
    public Car creatWihteCar()
    {
        // TODO Auto-generated method stub
        return new WhiteBenzCar();
    }
    //生产黑色Audi
    @Override
    public Car creaBlackCar()
    {
        // TODO Auto-generated method stub
        return new BlackBenzCar();
    }

}

保时捷工厂与上述工厂类似,不在赘述。
具体的产品类(白色奥迪):

public class WhiteAudiCar extends AbstractAudiCar
{

    @Override
    public void getColor()
    {
        System.out.println("白色奥迪");
    }
}

具体的产品类(黑色奥迪):

public class BlackAudiCar extends AbstractAudiCar
{

    @Override
    public void getColor()
    {
        System.out.println("黑色奥迪");

    }
}

具体的产品类(红色奥迪):

public class RedAudiCar extends AbstractAudiCar
{

    @Override
    public void getColor()
    {
        System.out.println("红色奥迪");

    }
}

还有白色、红色、黑色的奔驰,保时捷汽车与奥迪类似这里不在列出代码。

场景类:

public class Worker
{
    public static void main(String[] args)
    {
        //奥迪生产线
        AudiFactory audiFactory = new AudiFactory();
        //奔驰生产线
        BenzFactory benzFactory = new BenzFactory();
        //保时捷生产线
        PorscheFactory porscheFactory = new PorscheFactory();
        //生产黑色audi
        System.out.println("===========生产黑色audi===========");
        Car blackAudi = audiFactory.creaBlackCar();
        blackAudi.getCarType();
        blackAudi.paint();
        blackAudi.getColor();
        System.out.println("===========生产白色audi===========");
        Car whiteAudi =audiFactory.creatWihteCar();
        whiteAudi.getCarType();
        whiteAudi.paint();
        whiteAudi.getColor();
        System.out.println("===========生产红色audi===========");
        Car redAudi =audiFactory.creatRedCar();
        redAudi.getCarType();
        redAudi.paint();
        redAudi.getColor();
        System.out.println("===========生产黑色benz===========");
        Car blackBenz = benzFactory.creaBlackCar();
        blackBenz.getCarType();
        blackBenz.paint();
        blackBenz.getColor();
        System.out.println("===========生产白色benz===========");
        Car whiteBenz =benzFactory.creatWihteCar();
        whiteBenz.getCarType();
        whiteBenz.paint();
        whiteBenz.getColor();
        System.out.println("===========生产红色benz===========");
        Car redBenz =benzFactory.creatRedCar();
        redBenz.getCarType();
        redBenz.paint();
        redBenz.getColor();
    }
}

执行结果为:

===========生产黑色audi===========
车的品牌为奥迪
对车喷奥迪专用漆
黑色奥迪
===========生产白色audi===========
车的品牌为奥迪
对车喷奥迪专用漆
白色奥迪
===========生产红色audi===========
车的品牌为奥迪
对车喷奥迪专用漆
红色奥迪
===========生产黑色benz===========
车的品牌为奔驰
对车喷奔驰专用漆
白色奔驰
===========生产白色benz===========
车的品牌为奔驰
对车喷奔驰专用漆
白色奔驰
===========生产红色benz===========
车的品牌为奔驰
对车喷奔驰专用漆
红色奔驰

这样我们就生产出了不同颜色的汽车。

  上面描述的就是抽象工厂模式,抽象工厂模式是一种常用的模式,其定义如下:Provide an interface for creating families of related or dependent objects without specifying their concrete class.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类)。
  
  抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品,比如白色奥迪,黑色奥迪,红色奥迪);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值