标签:
当使用new创建对象时,是在实例化一个具体的类,如:
Duck duck = new MallardDuck();
当有一群相关的具体类时,通常会这样写:
Duck duck;if (picnic) {
duck = new MallardDuck();
} else if (hunting) {duck = new DecoyDuck();
} else if (inBathTub) {duck = new RubberDuck();
}这里有一些要实例化的具体类,究竟实例化哪个类,要在运行时根据条件决定,当看到这样的代码,一旦变化或扩展,就必须重新打开代码进行修改,这违背了“对扩展开放,对修改关闭”的原则。
假设有一家比萨店,作为店主人,你的代码可能这么写:
Pizza orderPizza() {Pizza pizza = new Pizza();
pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;
}但是你需要更多的比萨类型,所以必须增加一些代码:
Pizza orderPizza(String type) {Pizza pizza = new Pizza();
if (typr.equals("cheese")) {pizza = new CheesePizza();
} else if (typr.equals("greek")) {pizza = new GreekPizza();
} else if (typr.equals("pepperoni")) {pizza = new PepperoniPizza();
}pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;
}但是,当你发现竞争者已在他们的菜单中加入一些流行风味的比萨:ClamPizza(蛤蜊比萨)、VeggiePizza(素食比萨),也要把他们加入进去,而最近GreekPizza(希腊比萨)卖的不好,需要将其从菜单中去掉,于是需要修改上述代码。很明显,如果需要实例化具体类,将使orderPizza()出问题,无法让orderPizza()对修改关闭;但是,我们已经知道哪些会改变,哪些不会改变。最好将创建比萨的代码(上述代码中if…else…部分)移到另一个对象(SimplePizzaFactory)中,由这个新对象专职创建比萨。我们称这个新的对象为“工厂”,工厂(Factory)处理创建对象的细节。
标签:
原文地址:http://www.cnblogs.com/devotion/p/5429226.html