人类工业进化史 与 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() {
@Override
return new HuaWei(ORIGIN);
}
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