您的位置:首页 > 编程语言 > Java开发

java设计模式详解--工厂模式

2016-09-26 17:17 375 查看

java设计模式详解–工厂模式

1.工厂方法模式

在说工厂模式之前先来了解一下设计模式中的一个原则–开闭原则。遵循开闭原则设计出的模块具有两个主要特征:(以下2个特征出自百度百科)(1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。(2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。说白了就是对修改功能关闭,对扩展功能开放。下面举一个具体的例子(生产水果的例子),代码如下:
//生产水果接口

public interface Fruit {

void produceFruit();

}
““//生产苹果public class Apple implements Fruit {@Overridepublic void produceFruit() {System.out.println(“my name is apple!”);}}
//生产橘子public class Orange implements  Fruit {@Overridepublic void produceFruit() {System.out.println(“my name is orange!”);}}
//工厂类public class FruitFactory {public Fruit produceApple(){return  new Apple();}public Fruit produceOrange(){return  new Orange();}}
//测试类public class FactoryDemo {public static void main(String[] args) {FruitFactory fruitFactory = new FruitFactory();Fruit fruit = fruitFactory.produceApple();fruit.produceFruit();}}““输出结果如下:现在由于需求变更,添加生产香蕉的功能。我们改如何实现?简单的方法就是添加一个香蕉的class, 然后在工厂类中添加生产香蕉的方法就ok了!这样是可以完成我们生产香蕉的需求,但是为了我们一开始说的开闭原则,我们修改了工厂类。修改代码如下:““//香蕉public class Banana implements Fruit {@Overridepublic void produceFruit() {System.out.println(“my name is banana!”);}}
//修改后的工厂类public class FruitFactory {public Fruit produceApple(){return  new Apple();}public Fruit produceOrange(){return  new Orange();}public Fruit produceBanana(){return  new Orange();}}““添加的Banana class属于对扩展开放,但是修改的工厂类违反了对修改关闭的原则。所以我们需要重新设计我们的工厂模式,可以满足开闭原则。既然修改工厂类违反了开闭原则,那么我们新加工能时就应该避开修改工厂类,所以我们考虑使用多个工厂类来实现,当我们添加新功能时只需添加新的工厂类即可。具体代码如下:实体类沿用上面的即可,将工程类拆分为多个。““//apple factorypublic class AppleFactory {public Fruit produceApple(){return  new Apple();}}““““//orange factorypublic class OrangeFactory {public  Fruit produceOrange(){return  new Orange();}}
//banana factorypublic class BananaFactory {public Fruit produceBanana(){return  new Banana();}}““这样就满足了我们添加新工能不修改原有代码,只需添加相应的工程类和水果类即可。当然,这是一个很简单的工厂模式的例子,还可以设计出更好的工厂模式。有不对的地方大家可以留言一起交流。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息