工厂模式学习笔记
人类工业进化史 与 java设计模式
- 石器时代: new Object();
- 小作坊模式: 简单工厂模式
- 小工厂: 工厂方法模式
- 流水线大厂: 抽象工厂模式
简单工厂
- 注: 下面都会以手机厂商举例来理解各个设计模式, 全部代码会在最后提供下载地址
- 首先需要一些手机的抽象与实体,以水果X为例
public interface Phone { String getName(); String getOrigin(); }
/** * 水果X */ public class IPhoneX implements Phone{ public IPhoneX(){ } /** * 产地 */ private String origin; public IPhoneX(String origin) { this.origin = origin; } public String getName() { return "IPHONEX"; } @Override public String getOrigin() { return this.origin; } }
- 简单工厂模式的实现
/** * 小作坊: 简单工厂, 啥也能做, 要啥给啥 * 缺点: 啥也能做,修改动静太大, 不符合开闭原则, 新加一个手机品牌 , 增加对应品牌的实体, 需要修改 * simplefactory中if else的逻辑, 需要测试其整个方法的准确性 * 优点: 从此用户不用再去new对象,用户本身不再关心生产的过程,而只需要关心这个结果 */ public class SimpleFactory{ public Phone getPhone(String name) { if(name.equalsIgnoreCase("iphonex")){ return new IPhoneX(); }else if(name.equalsIgnoreCase("xiaomi")){ return new XiaoMi(); }else if(name.equalsIgnoreCase("huawei")){ return new HuaWei(); }else if(name.equalsIgnoreCase("nokia")){ return new Nokia(); }else { return null; } } }
- 简单工厂测试
public class SimpleFactoryTest { @Test public void testGetPhone() { SimpleFactory factory = new SimpleFactory(); assertEquals("iphonex",factory.getPhone("iphonex").getName().toLowerCase()); } }
工厂方法实现
- 抽象的工厂接口
/** * 工厂: * 工厂方法模式: 有了一定的规范, 各个产品都有对应的工厂 * * 工厂必然具有生产产品技能,统一的产品出口 * 适合只做产品, 产品不分族, 如果类似抽象工厂进行分组, 需要创建很多的工厂, DLNOKIAFACTORY、 HKNOKIAFACTORY.... */ public interface Factory { Phone getPhone(); }
- 工厂实现类
public class IPhoneXFactory implements Factory{ public Phone getPhone() { return new IPhoneX(); } }
- 工厂类测试
public class FactoryTest { @Test public void testGetPhone() { Factory factory = new IPhoneXFactory(); assertEquals("iphonex",factory.getPhone().getName().toLowerCase()); } }
抽象工厂实现
- 抽象工厂实现类
/** * 流水线: * 抽象工厂是用户的主入口, 定义了所有实现工厂能做的产品 * 在Spring中应用得最为广泛的一种设计模式 * 易于扩展 * 基本的逻辑都抽象出来, 而且可以进行随意组合, 用户只能用现有的功能,提高健壮性 * * 适合既做产品, 并且产品分流水线, 分为 大陆\ 港版 * */ public abstract class AbstractFactory { abstract Phone getXiaoMi(); abstract Phone getIPhoneX(); abstract Phone getHuaWei(); abstract Phone getNokia(); }
- 具体的流水线工厂
/** * 大陆某具体工厂 */ public class DLPhoneFactory extends AbstractFactory{ private final String ORIGIN = "dalu"; Phone getXiaoMi() { return new XiaoMi(ORIGIN); } Phone getIPhoneX() { return new IPhoneX(ORIGIN); } Phone getHuaWei() { return new HuaWei(ORIGIN); } @Override Phone getNokia() { return new Nokia(ORIGIN); } }
- 抽象工厂测试
/** * 抽象工厂产生俩个实际工厂分别产生自己的产品 */ public class AbstractFactoryTest { @Test public void testGetPhone() { AbstractFactory dlPhoneFactory = new DLPhoneFactory(); assertEquals("iphonex",dlPhoneFactory.getIPhoneX().getName().toLowerCase()); } }
最后附上源码下载地址:
- github地址: git@github.com:offline7LY/designpattern.git