zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    1:实例
    某客户想要购买一辆车,他要联系4S店,首先得有4S店(抽象工厂)的电话。

    客户上网查询(建造工厂),发现了宝马4S店(具体工厂)的电话和奔驰4S店(具体工厂)的电话。

    客户拨通了宝马4S店的电话(获取具体工厂),发现目前店里可以提供(生产)多款车型(具体产品)供
    客户选择(BMW 320、BMW 530,BMW 740)。

    客户拨通了奔驰4S店的电话(获取具体工厂),发现目前店里可以提供(生产)多款车型(具体产品)供
    客户选择(BenzC200、BenzE300)。
    代码实现:
    1:车的最高级抽象
    package AbstractFactory;
    
    /**
     * 作用:最高级抽象产品,用于抽象工厂的建造方法的返回值
     */
    public abstract class Car {
        abstract void drive();
    }

    2:宝马车的抽象和实现

    package AbstractFactory;
    
    /**
     * 作用:宝马产品的产品类
     */
    public abstract class BMWCar extends Car{
    }
    
    //宝马BMW320的具体实现
    class BMW320 extends BMWCar{
    
        @Override
        void drive() {
            System.out.println("BMW320,老板专用。");
        }
    }
    
    //宝马BMW530的具体实现
    class BMW530 extends BMWCar {
        public void drive()
        {
            System.out.println("BMW530,时不我待。");
        }
    }

    3:奔驰车的抽象和实现

    package AbstractFactory;
    
    /**
     * 作用:奔驰汽车的产品类
     */
    public abstract class BenzCar extends Car {
    }
    
    //奔驰C200的具体实现
    class BenzC200 extends BenzCar {
        public void drive()
        {
            System.out.println("BenzC200,实惠有面");
        }
    }
    
    //奔驰E300的具体实现
    class BenzE300 extends BenzCar {
        public void drive()
        {
            System.out.println("BenzE300,商务气派");
        }
    }

    4:抽象工厂,宝马工厂和奔驰车厂来实现它

    package AbstractFactory;
    
    /**
     * 作用:抽象工厂类
     */
    public abstract class AbstractFactory {
        public abstract Car getCar(String type) throws ClassNotFoundException,
                IllegalAccessException, InstantiationException;
    }
    
    //宝马工厂,生产所有的宝马类型
    class BMWFactory extends AbstractFactory{
    
        @Override
        public Car getCar(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            Class<?> aClass = Class.forName(type);
            return (BMWCar) aClass.newInstance();
        }
    }
    
    //奔驰工厂,生产所有的奔驰
    class BenzFactory extends AbstractFactory{
    
        @Override
        public Car getCar(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            Class<?> aClass = Class.forName(type);
            return (BenzCar) aClass.newInstance();
        }
    }

    5:超级工厂,建造工厂的工厂

    package AbstractFactory;
    
    /**
     * 作用:超级工厂类,建造工厂的工厂
     */
    public  class FactoryProducer {
        public static AbstractFactory getFactory(String type)
                throws IllegalAccessException, InstantiationException, ClassNotFoundException
        {
            Class cl = Class.forName(type);
            System.out.println("创建工厂:"+type);
            return (AbstractFactory)cl.newInstance();
        }
    }

    6:测试

    package AbstractFactory;
    
    /**
     * 作用:
     */
    public class Demo {
        public static void main(String[] args) throws Exception{
            //超级工厂去创建生产宝马的工厂
            AbstractFactory bmwFactory = FactoryProducer.getFactory("AbstractFactory.BMWFactory");
            //宝马工厂去生产具体的宝马类型
            bmwFactory.getCar("AbstractFactory.BMW320").drive();
    
            //超级工厂去创建生产宝马的工厂
            AbstractFactory benzFactory = FactoryProducer.getFactory("AbstractFactory.BenzFactory");
            //宝马工厂去生产具体的宝马类型
            benzFactory.getCar("AbstractFactory.BenzC200").drive();
        }
    }
  • 相关阅读:
    常见算法复杂度解析
    Linux shell脚本根据文件路径信息获取路径和名称
    linux 目录递归替换差异文件
    Linux普通用户具备root用户操作权限
    java线上异常定位工具
    OCR
    国内镜像
    hadoop镜像
    处理Jsp出现乱码问题
    无缝滚动
  • 原文地址:https://www.cnblogs.com/bulrush/p/10739963.html
Copyright © 2011-2022 走看看