您的位置:首页 > 其它

设计模式课后习题(工厂模式)

2016-03-23 22:11 274 查看
Q : 在简单工厂方法模式,工厂方法模式,与抽象工厂模式中,那个模式符合开闭原则?为什么?那个模式一般不符合开闭原则?或者那种情况下符合,那种情况下不符合。

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
即可。符合开闭原则。但是如果这个时候添加了一个新的产品。飞机 。这个时候我们就需要对整个的服务的代码有大的调整,这个时候则是不符合开闭原则的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式