工厂方法模式
代码逻辑并不复杂,注释比较详尽,在此不多描述,直接看代码:
/* * 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); }
/* * 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 { }
/* * 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("我是捷安特自行车"); } }
/* * 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("我是美利达自行车"); } }
/* * 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); } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.factory.method; /** * @description 交通工具接口 * @author panteng * @date 17-2-3. */ public interface 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(); }
/* * 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("我是奥迪汽车"); } }
/* * 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("我是大众汽车"); } }
/* * 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); } }
/* * 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(); } }
看起来貌似一个简单的逻辑,写了这么多代码!
虽然代码比较多,实际上程序的易读性并不差,更重要的是利于以后的扩展,有利于项目后期的迭代更新!
===========================设计模式系列文章=========================