设计模式课后习题(工厂模式)
2016-03-23 22:11
274 查看
Q : 在简单工厂方法模式,工厂方法模式,与抽象工厂模式中,那个模式符合开闭原则?为什么?那个模式一般不符合开闭原则?或者那种情况下符合,那种情况下不符合。
A:首先简单工厂模式是不符合开闭原则的,开闭原则的定义为open for extension . close for modification. 对于已经写好的代码是不允许进行修改的,但是可以扩展已经写好的代码。简单工厂模式,使用的是一个静态的工厂场类。书写的代码如下图:
上面基本就是一个简单的工厂方法。可以看出,如果这个时候添加了一个新的ProductC这个时候,会怎么样呢。首先工厂创建类中的if判断肯定需要再次添加一个。很明显这样就是修改了核心的工具类方法。违背了 close for modification.
下面来看一看工厂方法模式对这个问题的处理。
上面基本上就是工厂方法模式的代码书写风格,我们想一下。如果这个时候有了一个新的产品C这个时候,代码会发生什么样的变化,首先,服务端的代码需要进行扩展,加两个个实现类
下面接着看第三种,抽象工厂模式。当然场景可能需要进行更新为稍微复杂一点的情况了。例如:现在需要对汽车和游艇的参数进行统计,他们都包含,普通,中等,高级三个层次。
如果这个时候,我们需要添加car 和yacht 都需要添加一个产品类型,奢华型。这个时候我们是不需要添加修改现有的代码的只需要添加新的类即可。
A:首先简单工厂模式是不符合开闭原则的,开闭原则的定义为open for extension . close for modification. 对于已经写好的代码是不允许进行修改的,但是可以扩展已经写好的代码。简单工厂模式,使用的是一个静态的工厂场类。书写的代码如下图:
public static Product createObject(String type){ if(type == "A"){ return new ProductA(); }else if(type == "B"){ return new ProductB(); } ... } public interface Product {..} public class ProductA implement Product{..} public class ProductB implement Product{..} class Client{ Main{ Product p = Creator.createObject(A); p.doSome(); } }
上面基本就是一个简单的工厂方法。可以看出,如果这个时候添加了一个新的ProductC这个时候,会怎么样呢。首先工厂创建类中的if判断肯定需要再次添加一个。很明显这样就是修改了核心的工具类方法。违背了 close for modification.
下面来看一看工厂方法模式对这个问题的处理。
public interface Product {..} public class ProductA implement Product{..} public class ProductB implement Product{..} public interface Creator{ Product createObject(); } public class CreateProductA extends Creator{ Product createObject(){ return new ProductA(); } } public class CreatorProductB extends Creator{ Product createObject(){ return new ProductB(); } } Client{ Main(){ Creator creator = null; if(optionA){ creator = new CreatorProductA(); }else if... Product pro = creator.creatObject(); pro.doSome(); } }
上面基本上就是工厂方法模式的代码书写风格,我们想一下。如果这个时候有了一个新的产品C这个时候,代码会发生什么样的变化,首先,服务端的代码需要进行扩展,加两个个实现类
CreatorProductC ProductC这样就行了,已经写好的之前的代码不用重新编译就可以使用了。完全符合open for extension. 当然有的人会说,客户端的代码不是也要添加一个新的判断吗,没错,但是那个是客户端的事情,他使用的问题,不用我们后台服务区管理。对于我们后台来说是完全符合开闭原则的。
下面接着看第三种,抽象工厂模式。当然场景可能需要进行更新为稍微复杂一点的情况了。例如:现在需要对汽车和游艇的参数进行统计,他们都包含,普通,中等,高级三个层次。
public interface Car{...} public class NormalCar implements Car{...} public class MiddleCar implements Car{...} public class AdvancedCar implements Car{...} // omit the Yacht interface and implementations ... public abstract class Subject{ public getSubject(String type){ if(type == "car"){ return createCar()} if(type == "yacht"){return createYacht()} } Car createCar(); Yacht createYacht(); } public class NormalSubject extends Subject{ Car createCar(){return NormalCar()}; Yacht createYacht(){return NormalYacht}; } public class MiddleSubject extends Subject{ Car createCar(){..}; Yacht createYacht(){..}; } public class AdvancedSubject extends Subject{ Car createCar(){..}; Yacht createYacht(){..}; }
如果这个时候,我们需要添加car 和yacht 都需要添加一个产品类型,奢华型。这个时候我们是不需要添加修改现有的代码的只需要添加新的类即可。
luxurySubject luxuryCar luxuryYacht即可。符合开闭原则。但是如果这个时候添加了一个新的产品。飞机 。这个时候我们就需要对整个的服务的代码有大的调整,这个时候则是不符合开闭原则的。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用