码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法模式

时间:2017-02-03 19:34:21      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:客户   else   不同的   and   实现   复杂   image   private   modifier   

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

技术分享
/*
 * 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

 

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

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

工厂方法模式

标签:客户   else   不同的   and   实现   复杂   image   private   modifier   

原文地址:http://www.cnblogs.com/tengpan-cn/p/6363252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!