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

    抽象工厂模式相对于简单工厂模式,会复杂一些,但是扩展性变得更加好;

    一、实现抽象工厂一共分一下几个步骤:

    • 创建产品接口
    • 创建产品抽象类
    • 创建产品具体实现类
    • 创建工厂接口
    • 创建抽象工厂
    • 创建具体工厂实现类
    • 创造者调用创造方法

    下面是简单的类图:

     

    产品类图:

     

     工厂类图:

    1、创建产品接口

    package com.dongl.abstractfactory;
    
    /**
     * 交通工具接口
     * 定义了交通工具可以行驶  可以停止
     */
    public interface Vehicle {
    
        //行驶
        public void go();
    
        //停止
        public void stop();
    
        //定义性别
        public void color();
    }

    2、创建产品抽象类

    小汽车

    package com.dongl.abstractfactory;
    
    public abstract class AbstractCar implements Vehicle {
    
        public void go() {
            System.out.println("小汽车行驶 di di di -------------");
        }
    
    
        public void stop() {
            System.out.println("小汽车停下来 ---------------");
        }
    }

    公交车:

    package com.dongl.abstractfactory;
    
    public abstract class AbstractBus implements Vehicle{
    
        public void go() {
            System.out.println("公交车行驶 wuwuwu ------------");
        }
    
    
        public void stop() {
            System.out.println("公交车停止 -------------");
        }
    }

    飞机:

    package com.dongl.abstractfactory;
    
    public abstract class AbstractPlane implements Vehicle {
    
        public void go() {
            System.out.println("飞机起飞 sou sou sou ---------");
        }
    
        public void stop() {
            System.out.println("飞机停下来 ----------------");
        }
    }

    3、创建产品具体实现类

    红色小汽车:

    package com.dongl.abstractfactory;
    
    public class CarRed extends AbstractCar {
    
        public void color(){
            System.out.println("该小汽车颜色为红色");
        }
    }

    黑色小汽车:

    package com.dongl.abstractfactory;
    
    public class CarBlack extends AbstractCar {
    
        public void color(){
            System.out.println("该小汽车颜色为黑色");
        }
    }

    红色公交车:

    package com.dongl.abstractfactory;
    
    public class BusRed extends AbstractBus{
        public void color(){
            System.out.println("该公交车颜色为红色");
        }
    }

    黑色公交车:

    package com.dongl.abstractfactory;
    
    public class BusBlack extends AbstractBus{
        public void color(){
            System.out.println("该公交车颜色为黑色");
        }
    }

    红色飞机:

    package com.dongl.abstractfactory;
    
    public class PlaneRed extends AbstractPlane {
        public void color(){
            System.out.println("该飞机颜色为红色");
        }
    }

    黑色飞机:

    package com.dongl.abstractfactory;
    
    public class PlaneBlack extends AbstractPlane {
    
        public void color(){
            System.out.println("该飞机颜色为黑色");
        }
    }

    4、创建工厂接口

    package com.dongl.abstractfactory;
    
    /**
     * 交通工具抽象类
     * 定义制造方法
     */
    public interface VehicleFactory {
        //造小汽车
        public Vehicle createCar();
        //造公交
        public Vehicle createBus();
        //造飞机
        public Vehicle createPlane();
    }

    5、创建抽象工厂

    package com.dongl.abstractfactory;
    
    /**
     * 创建对象实例
     */
    public abstract class AbstractVehicleFactory implements VehicleFactory {
    
        protected Vehicle createVehicle(VehicleEnum vehicleEnum){
            Vehicle vehicle = null;
    
            //如果制造的交通工具存在 创建对象实例
            if(!vehicleEnum.getValue().equals("")) {
                try {
                    vehicle = (Vehicle) Class.forName(vehicleEnum.getValue()).newInstance();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
            return vehicle;
        }
    }

    6、创建具体工厂实现类

    红色交通工具工厂:

    package com.dongl.abstractfactory;
    
    public class RedVehicleFactory extends AbstractVehicleFactory {
    
        @Override
        public Vehicle createCar() {
            return super.createVehicle(VehicleEnum.CarRed);
        }
    
        @Override
        public Vehicle createBus() {
            return super.createVehicle(VehicleEnum.BusRed);
        }
    
        @Override
        public Vehicle createPlane() {
            return super.createVehicle(VehicleEnum.PlaneRed);
        }
    }

    黑色建通工具工厂:

    package com.dongl.abstractfactory;
    
    public class BlackVehicleFactory extends AbstractVehicleFactory {
    
        @Override
        public Vehicle createCar() {
            return super.createVehicle(VehicleEnum.CarBlack);
        }
    
        @Override
        public Vehicle createBus() {
            return super.createVehicle(VehicleEnum.BusBlack);
        }
    
        @Override
        public Vehicle createPlane() {
            return super.createVehicle(VehicleEnum.PlaneBlack);
        }
    }

    7、创造者调用创造方法

    package com.dongl.abstractfactory;
    
    public class Creator {
    
        public static void main(String[] args) {
            /**这里可以使用两个工厂进行生产交通工具  也就是所谓的两条生产线*/
            //第一条生产线 RedVehicleFactory 生产红色交通工具
            RedVehicleFactory redVehicleFactory = new RedVehicleFactory();
    
            //第二条生产线 BlackVehicleFactory 生产黑色交通工具
            VehicleFactory blackVehicleFactory = new BlackVehicleFactory();
    
            //红色生产线生产一辆小汽车
            Vehicle car = redVehicleFactory.createCar();
            car.go();  car.stop(); car.color();
    
            //黑色生产线生产一辆公交车
            Vehicle bus = blackVehicleFactory.createBus();
            bus.go(); bus.stop(); bus.color();
    
        }
    }

    到这里抽象工厂的设计模式就讲完了,如果有不足,请指出,共同探讨。

  • 相关阅读:
    OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
  • 原文地址:https://www.cnblogs.com/dongl961230/p/13305155.html
Copyright © 2011-2022 走看看