zoukankan      html  css  js  c++  java
  • 工厂方法模式

    代码逻辑并不复杂,注释比较详尽,在此不多描述,直接看代码:

    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.method;
    
    /**
     * @description 工厂方法模式示例代码
     *              工厂方法模式是在简单工厂模式基础上演化而来的
     *              工厂方法模式的核心工厂类不负责产品的创建,而是将具体的创建工作分配给子类去做
     *              核心类是一个抽象工厂,解决了简单工厂模式只能生产一类产品的缺点,可以适用于更复杂的场景
     *              实现了开闭原则,即针对扩展是开放的,针对修改是封闭的
     *              虽然工厂方法模式可以生产多类产品,但这些产品通常表现为一个产品结构,即所有的产品都衍生
     *              自同一个接口或者抽象类,这样看起来似乎使用简单工厂模式也能实现,但是使用工厂模式可以更好
     *              的更详细的描述产品之间的关系。分类可以更加细化。
     * @author panteng
     * @date 17-2-3.
     */
    public abstract class AbstractFactoryMethodCase {
        public abstract Vehicle getVehicle(String brand);
    }
    AbstractFactoryMethodCase
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.method;
    
    /**
     * @description
     * @author panteng
     * @date 17-2-3.
     */
    public abstract class AbstractBike implements Vehicle {
    }
    AbstractBike
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.method;
    
    /**
     * @description
     * @author panteng
     * @date 17-2-3.
     */
    public class GiantBike extends AbstractBike {
        /**
         * @description 展示外观
         * @param
         * @return
         * @throws
         */
        public void showAppearance() {
            System.out.println("我是捷安特自行车");
        }
    }
    GiantBike
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.method;
    
    /**
     * @description
     * @author panteng
     * @date 17-2-3.
     */
    public class MeridaBike extends AbstractBike {
        /**
         * @description 展示外观
         * @param
         * @return
         * @throws
         */
        public void showAppearance() {
            System.out.println("我是美利达自行车");
        }
    }
    MeridaBike
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.method;
    
    /**
     * @description 自行车工厂
     * @author panteng
     * @date 17-2-3.
     */
    public class BikeFactory extends AbstractFactoryMethodCase {
    
        /**
         * 生产自行车的方法
         * @param brand 自行车品牌种类
         * @return 自行车对应实例
         */
        private AbstractBike getBike(String brand) {
            if ("Giant".equals(brand)) {
                return new GiantBike();
            } else if ("Merida".equals(brand)) {
                return new MeridaBike();
            } else {
                return null;
            }
        }
    
        @Override
        public Vehicle getVehicle(String brand) {
            return getBike(brand);
        }
    }
    BikeFactory
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.method;
    
    /**
     * @description 交通工具接口
     * @author panteng
     * @date 17-2-3.
     */
    public interface Vehicle {
    }
    Vehicle
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.simple;
    
    import com.pt.factory.method.Vehicle;
    
    /**
     * @description 抽象汽车类
     * @author panteng
     * @date 17-2-3.
     */
    public abstract class AbstractCar implements Vehicle {
        /** 品牌 */
        protected String brand;
        /** 油耗 */
        protected float oilWear;
    
        /** 展示外观 */
        public abstract void showAppearance();
    }
    AbstractCar
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.simple;
    
    /**
     * @description 奥迪汽车实体类
     * @author panteng
     * @date 17-2-3.
     */
    public class AodiCar extends AbstractCar {
    
        /**
         * @description 展示外观
         * @param
         * @return
         * @throws
         */
        public void showAppearance() {
            System.out.println("我是奥迪汽车");
        }
    }
    AodiCar
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.simple;
    
    /**
     * @description 大众汽车实体类
     * @author panteng
     * @date 17-2-3.
     */
    public class DaZhongCar extends AbstractCar {
        /**
         * @description 展示外观
         * @param
         * @return
         * @throws
         */
        public void showAppearance() {
            System.out.println("我是大众汽车");
        }
    }
    DaZhongCar
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.simple;
    
    import com.pt.factory.method.AbstractFactoryMethodCase;
    import com.pt.factory.method.Vehicle;
    
    /**
     * @description 简单工厂模式示例代码
     *              通过定义一个类来负责创建其他类,被创建的实例通常具有共同的父类或实现了同一个接口
     *              优点:对于使用者来说,无需了解对象是如何创建的,可以更加直接方便的拿到对象,可以
     *                  方便的将一类对象统一起来,简化客户端操作
     *              缺点:工厂类出问题,所有调用工厂创建对象的客户端都会出问题;
     *                  通常来说,简单工厂模式只能用于创建某一类产品,不可以创建几类产品。
     *              JDBC就使用了简单工厂模式,将不同的数据库统一起来
     * @author panteng
     * @date 2017-02-03
     *
     * @description 简单工厂模式的实现
     * @modifier panteng
     * @date 2017-02-03
     */
    
    public class CarFactory extends AbstractFactoryMethodCase {
    
        /**
         * 生产汽车的方法
         * @param brand 汽车品牌种类
         * @return 汽车对应实例
         */
        private AbstractCar getCar(String brand) {
            if ("Aodi".equals(brand)) {
                return new AodiCar();
            } else if ("DaZhong".equals(brand)) {
                return new DaZhongCar();
            } else {
                return null;
            }
        }
    
        @Override
        public Vehicle getVehicle(String brand) {
            return getCar(brand);
        }
    }
    CarFactory
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.factory.simple;
    
    import com.pt.factory.method.AbstractFactoryMethodCase;
    import com.pt.factory.method.BikeFactory;
    import com.pt.factory.method.MeridaBike;
    import org.junit.Before;
    import org.junit.Test;
    
    /**
     * @description 简单工厂模式测试类
     * @author panteng
     * @date 2017-02-03.
     */
    public class FactoryMethodCaseTest {
    
        @Before
        public void setUp() throws Exception {
            System.out.println("start... ...");
        }
    
        @Test
        public void getVehicle() {
            AbstractFactoryMethodCase factory = new BikeFactory();
            MeridaBike meridaBike = (MeridaBike) factory.getVehicle("Merida");
            meridaBike.showAppearance();
    
            factory = new CarFactory();
            AodiCar aodiCar = (AodiCar) factory.getVehicle("Aodi");
            aodiCar.showAppearance();
        }
    }
    FactoryMethodCaseTest

    看起来貌似一个简单的逻辑,写了这么多代码!

    虽然代码比较多,实际上程序的易读性并不差,更重要的是利于以后的扩展,有利于项目后期的迭代更新!

    ===========================设计模式系列文章=========================

    简单工厂模式

    工厂方法模式

    抽象工厂模式

    建造者模式

    原型模式

    适配器模式

    桥接模式

    装饰模式

    代理模式

    组合模式

    门面模式

    享元模式

    责任链模式

    命令模式

    中介者模式

    备忘录模式

    观察者模式

    状态模式

    策略模式

    模板方法模式

    访问者模式

  • 相关阅读:
    清理iOS工程里无用的图片,可瘦身ipa
    NSTimer内存泄漏导致控制器不调用dealloc
    iOS面试题 -总结 ,你的基础扎实吗?
    Xcode找不到模拟器出现"My Mac"
    前端开发
    并发编程&数据库
    数据库
    4.2
    4.5
    4.4
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6363252.html
Copyright © 2011-2022 走看看