创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。其隐藏了类的实例的创建细节。包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。
工厂模式并不是一个独立的设计模式,而是三种功能接近的设计模式(简单工厂模式、工厂方法模式、抽象工厂模式)的统称。
工厂模式举例
创建对象如果需要一系列的初始化操作,一般来说可以写在构造函数里,不过这样的话会导致构造函数的代码变得太长,降低程序的可读性。所以,我们可以增加一个特殊的类,即工厂类,用来负责对象的创建工作。
假设我们需要一个被广泛引用的“口罩类”,其初始化的代码也比较复杂:
public class Mask{// 构造函数public Mask(){// ...// 100行初始化代码k}
}
简单工厂模式
1. 我们可以构建一个“口罩工厂”专门负责创建口罩对象,把口罩的初始化代码迁移到工厂类的创建方法中:
public class Mask{public Mask();
}// 口罩工厂
public class MaskFactoy{public Mask createMask(){Mask mask = new Mask();// ...// 100行初始化代码retrun mask;}
}
2.1 假设口罩类存在子类,可以将口罩类作为抽象接口,子类(高级口罩和低级口罩)实现接口。
public interface IMask{void show();
} public class HighEndMask implements IMask{@Overridepublic void show(){System.out.println("我是高端口罩");}
}public class LowEndMask implements IMask{@Overridepublic void show(){System.out.println("我是低端口罩");}
}
2.2 创建工厂
public class MaskFactory{public IMask createMask(type){IMask mask = null;if("高端口罩".equals(type)){mask = new HighEndMask();// ...// HighEndMask 的100行初始化代码}else if("低端口罩".equals(type)){mask = new LowEndMask();// ...// LowEndMask 的100行初始化代码}return mask;}
}
2.3 只要传入对应的类型名称,就可以创建相应的口罩对象:
public class Test{public staic void main(String[]){MaskFactory factory = new MaskFactory();IMask maskA = factory.createMask("高端口罩");IMask maskB = factory.createMask("低端口罩");maskA.show();maskB.show();}
}
工厂方法模式
如果增加新的口罩子类,口罩工厂的创建方法中就要新增if-else判断,不符合面向对象的开发-封闭原则。所以我们可以为每个口罩子类创建对应的工厂子类,这些工厂子类分别实现抽象的工厂接口。(多态)
开放-封闭原则,即在程序中对扩展开放,对修改封闭。如果每次业务改动都要新增if-else,就涉及对旧有代码的修改,容易出错,可读性也不好。
1.2 所以我们可以修改简单工厂模式中2.2的内容,重构一下工厂类的逻辑:
public interface IMaskFactory{IMask createMask();
}public class HighEndMaskFactory implements IMaskFactory{@Overridepublic IMask createMask(){IMask mask = new HighEndMask(); // ...// 100行初始化代码return mask;}
}public class LowEndMaskFactory implements IMaskFactory{@Overridepublic IMask createMask(){IMask mask = new LowEndMask();// ...// 100行初始化代码return mask;}
}
1.2 使用
public class Test{public static void main(String[]){IMaskFactory factoryA = new HighEndMaskFactory();IMask maskA = factoryA.createMask();maskA.show();IMaskFactory factoryB = new LowEndMaskFactory();IMask maskB = factoryB.createMask();maskB.show();}
}
抽象工厂模式
如果需要创建子类越来越多,不只有口罩,还有防毒面具、防护服之类的,难道每一个子类都需要对应一个工厂吗?
解决:如果带创建的产品非常多,不需要为每个产品配上一个工厂类(比如高端口罩,低端口罩,高端防护服,低端防护服),而是可以把这些产品进行分组(把产品分为高端组和低端组,不同产品有工厂类的不同方法来创建)。
1.1 创建产品类,口罩和防护服
// 口罩接口和两个实现子类
public interface IMask{void showMask();
}public class HighEndMask implements IMask{@Overridepublic void showMask(){System.out.println("我的高端口罩");}
}public class LowEndMask implements IMask{@Overridepublic void showMask(){System.out.println("我的低端口罩");}
}// 防护服接口和两个实现子类
public interface IProjectiveSuit{void showSuit();
}public class HighEndProjectSuit implements IProjectiveSuit{@Overridepublic void showSuit(){System.out.println("我的高端防护服");}
}public class LowEndProjectSuit implements IProjectiveSuit{@Overridepublic void showSuit(){System.out.println("我的低端防护服");}
}
1.2 工厂类
// 区别在此,工厂方法模式创建 IMaskFactory 接口,分别实现高端口罩与低端口罩两个工厂子类
// 而抽象工厂模式,也是抽象出高端和低端两个工厂子类,在里面实现创建口罩和防护服类的方法
public interface IFactory{void createMask();void createSuit();
}public class HighEndFactory implements IFactory{@Overridepublic IMask createMask(){IMask mask = new HighEndMask();// ...// 100行初始化代码return mask;}@Overridepublic IProjectiveSuit createSuit(){IProjectiveSuit suit = new HighEndProjectSuit();// ...// 100行初始化代码return suit;}
}
public class LowEndFactory implements IFactory{@Overridepublic IMask createMask(){IMask mask = new LowEndMask();// ...// 100行初始化代码return mask;}@Overridepublic IProjectiveSuit createSuit(){IProjectiveSuit suit = new LowEndProjectSuit();// ...// 100行初始化代码return suit;}
}
1.3 使用
public class Test{public void Main(String[]){// 创建工厂IFactory factoryA = new HighEndFactory();IFactory factoryB = new LowEndFactory();// 创建高端口罩,高端防护服IMask maskA = factoryA.createMask();IProjectiveSuit suitA = factoryA.createSuit();// 创建低端口罩,低端防护服IMask maskB = factoryB.createMask();IProjectiveSuit suitB = factoryB.createSuit();// 使用maskA.showMask();maskB.showMask();suitA.showSuit();maskB.showSuit();}
}
参考
设计模式教程
[微信公众号:程序员小灰]