简单工厂模式:
总结一下步骤:
1.接口A:声明dosth();【我要去旅行】
2.不同的类(a1,a2)去实现A的不同方式的dosth();【方式:坐火车,坐飞机】
3.抽象出一个工厂类B,声明一个Create()方法控制使用哪一个类(a1,a2)去create;【实施旅行方案:选择做火车,选择做飞机】
工厂模式:
总结一下步骤:
1.接口A:声明dosth();【我要去旅行】
2.不同的类(a1,a2)去实现A的不同方式的dosth();【方式:坐火车,坐飞机】
3.抽象出一个接口工厂B,声明一个Create()方法做到dosth()【实施旅行方案】;
4.不同的类(b1,b2)去实现B的创造方法;【选择做火车,选择做飞机】
优点
工厂方法比简单工厂多了一层抽象。
由于抽象工厂层的存在,当我们需要修改一个实现的时候,我们不需要修改工厂的角色,只需要修改实现的子类(a1,a2)【坐汽车,开车】就可以完成这个工作。
同样,当我们需要增加一个新产品的时候,我们也不需要修改工厂的角色,只需要增加一个新的实现工厂(b1,b2)【选择开车】来完成实现就可以了。
显然,这样更易于扩展,并且,整体代码的层级结构更加分明,创建实际产品的职责更加单一。
此外,很显然客户在定义工厂角色的时候不需要知道实现子类。只有当实际需要创建的时候,才动态指定子类。这同样带来了代码的稳定性和最小可知性。
缺点
显然,使用工厂方法的代码量是多于简单工厂的。
同时,每增加一个新的产品,就会增加一个新的工厂类,代码的复杂程度自然也随之上升了。我们会为此创建很多的工厂。
抽象工厂模式:
总结一下步骤:
1.多个接口A:声明dosth();【我要做很多事情】
2.多个不同的类(a1,a2)去实现A的不同方式的dosth();【我做每件事情的不同方式】
3.抽象出一个接口工厂B,声明每一个Create()方法(无所谓);【实施做每件事情的方案】
4.多个不同的类(b1,b2)去实现B的创造方法;【做每件事情的时候选择哪种方式】
优点
当我们需要增加一个产品族的时候,我们只需要增加一个工厂(b1,b2),实现其中所有产品的实现就行了。
抽象工厂的设计,使得我们可以很容易的增加一个产品系列。
缺点
抽象工厂当中,产品族的定义使得子类必须去实现所有的产品生产【b要实现B的所有方法】。
因此,抽象工厂并不适合于横向扩展,即需要增加产品的情况【
增加我要做的事情的数量】。
一旦需要增加产品,那么我们甚至需要去修改抽象的基类【A】。这是比较违反开闭原则,不太符合面向对象设计的做法。
部分内容引自:https://blog.youkuaiyun.com/yuechuzhao/article/details/46963559