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();
    
        }
    }

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

  • 相关阅读:
    leetcode刷刷刷
    素数问题
    TCP/IP详解(整理)
    关于区块链应用方向与前景的一些思考
    设计模式
    面经中的各种问题汇总
    基于消逝时间量的共识机制(POET)
    c++语言知识点汇总
    二叉树前中后/层次遍历的递归与非递归形式(c++)
    layui表格搜索数据登录失效后的处理
  • 原文地址:https://www.cnblogs.com/dongl961230/p/13305155.html
Copyright © 2011-2022 走看看