工厂方法模式

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

/*
 * 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

 

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

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

 

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

简单工厂模式

工厂方法模式

抽象工厂模式

建造者模式

原型模式

适配器模式

桥接模式

装饰模式

代理模式

组合模式

门面模式

享元模式

责任链模式

命令模式

中介者模式

备忘录模式

观察者模式

状态模式

策略模式

模板方法模式

访问者模式

posted @ 2017-02-03 18:33  沙中世界  阅读(229)  评论(0编辑  收藏  举报