沙拉酱
许多这时候他们而已期许以获取第一类示例方可,并不重视示例内部结构操作过程(比如有关Field的具体内容怎样增设)。
那个这时候就能将透过厂房商业模式来化解那个难题,其反之亦然也是一类建立型商业模式。将示例的具体内容内部结构操作过程展开PCB以对外过滤,就像现实世界中他们只需从厂房间接拾获商品方可,而无须care商品在厂房里的具体内容制造操作过程
假定有四种国际品牌的电动汽车:BMW奥迪、Benz宝马、Rolls Royce宾利。顾客交付了其中某个国际品牌的电动汽车,那么沙拉酱只须要在电动汽车厂房把车造好了间接拿取就好了,再者车咋造的,相信没有顾客会Care吧……实际上在计算机科学领域中,这样的需求也常有,Client而已须要两个示例第一类而已,再者那个第一类具体内容怎么内部结构的,他不须要也不想知道这么多技术细节。那个这时候就能转作厂房的概念来化解那个难题,或者说这儿的厂房不厚积薄发罢了,改为建立示例
这儿,他们先来如是说 Simple Factory Pattern 单纯厂房商业模式。其有下列四种配角:
抽象沙拉酱现在,瞧瞧他们来透过标识符同时实现 Simple Factory Pattern 单纯厂房商业模式。第二步,先表述两个电动汽车的USB
/** * 抽象化商品配角: 车 */ public interface Car { void drive(); }然后再提供电动汽车USB的具体内容同时实现类
/** * 具体内容商品配角:宝马 Benz */ public class Benz implements Car { @Override public void drive() { System.out.println("驾驶员在驾车Benz"); } } ... /** * 具体内容商品配角:奥迪 BMW */ public class BMW implements Car { @Override public void drive() { System.out.println("驾驶员在驾车BMW"); } } ... /** * 具体内容商品配角:宾利 Rolls Royce */ public class RollsRoyce implements Car { @Override public void drive() { System.out.println("驾驶员在驾车Rolls Royce"); } }最后,透过两个CarFactory厂房同时实现示例的内部结构、以获取
/** * 厂房配角 */ public class CarFactory { public static Car getCar(String type) { if( type==null ) { return null; } Car car = null; switch (type) { case "BMW": car = new BMW(); break; case "Benz": car = new Benz(); break; case "RollsRoyce": car = new RollsRoyce(); break; default: car = null; } return car; } }下面透过两个单元试验来模拟其使用方式
public class SimpleFactoryDemo { public static void main(String[] args) { Car bmw = CarFactory.getCar("BMW"); bmw.drive(); Car benz = CarFactory.getCar("Benz"); benz.drive(); Car rollsRoyce = CarFactory.getCar("RollsRoyce"); rollsRoyce.drive(); } }从试验结论能看出,结论符合预期
Factory Pattern 厂房商业模式前文如是说的Simple Facotry Pattern 单纯厂房商业模式,虽然能让client不用再关注示例的具体内容内部结构操作过程了,但是其存在两个明显的优点。每每他们须要加进两个捷伊Car同时实现类时,都须要对CarFactory类展开修正。这显然破坏了开合原则,即对扩展开放、对修正停用。那怎样化解那个难题呢?那个这时候就须要导入责任编辑的自问自答了——Factory Patttern 厂房商业模式,其又称作厂房方式商业模式。该设计商业模式与单纯厂房商业模式区别、
改良之处就在于,其对于厂房的设计是基于USB的思想,具体内容地,其将单纯厂房商业模式中的厂房配角改良为下列两个配角
显然该设计商业模式下的抽象化商品配角、具体内容商品配角没有发生变化,所以CarUSB及其具体内容同时实现类的Benz、BMW、RollsRoyce部分无须改动,如下所示
/** * 抽象化商品配角: 电动汽车 */ public interface Car { void drive(); } ... /** * 具体内容商品配角:宝马 Benz */ public class Benz implements Car { @Override public void drive() { System.out.println("驾驶员在驾车Benz"); } } ... /** * 具体内容商品配角:奥迪 BMW */ public class BMW implements Car { @Override public void drive() { System.out.println("驾驶员在驾车BMW"); } } ... /** * 具体内容商品配角:宾利 Rolls Royce */ public class RollsRoyce implements Car { @Override public void drive() { System.out.println("驾驶员在驾车Rolls Royce"); } }现在,他们先来表述两个电动汽车厂房的USB
/** * 抽象化厂房配角:电动汽车厂房 */ public interface CarFactory { Car getCar(); }然后,针对四种不同的商品Benz、BMW、RollsRoyce,分别提供各自具体内容的厂房类
/** * 具体内容厂房配角:Benz 厂房 */ public class BenzFactory implements CarFactory{ @Override public Benz getCar() { return new Benz(); } } ... /** * 具体内容厂房配角:BMW 厂房 */ public class BMWFactory implements CarFactory{ @Override public BMW getCar() { return new BMW(); } } ... /** * 具体内容厂房配角:Rolls Royce 厂房 */ public class RollsRoyceFactory implements CarFactory{ @Override public RollsRoyce getCar() { return new RollsRoyce(); } }现在让他们来实际试验下
public class FactoryMethodDemo { public static void main(String[] args) { CarFactory factory = new BenzFactory(); Car benz = factory.getCar(); benz.drive(); factory = new BMWFactory(); Car bmw = factory.getCar(); bmw.drive(); factory = new RollsRoyceFactory(); Car rollsRoyce = factory.getCar(); rollsRoyce.drive(); } }能看到试验结论,符合预期
参考文献Head First 设计商业模式 弗里曼著