很容易看出,简单工厂模式是不易维护的,如果需要添加新的产品,则整个系统都需要修改。如果我们需要添加诸如PRO7、PRO8等产品,直接在工程类中添加即可。但是如果这时候根部不知道还有什么产品,只有到子类实现时才知道,这时候就需要工厂方法模式。
而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以实现起来是比较麻烦的,那么工厂方法模式正式解决这个问题的,下面就介绍工厂方法模式。
工厂方法模式
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
针对上面的例子,如果使用工厂方法模式,即将工厂定义为一个接口,然后由具体的工厂来确定需要生成什么样的产品,为了与简单工厂比较,这里还是贴上代码:
//工厂方法模式public class FactoryMethod { public static void main(String args[]){ IFactory bigfactory; bigfactory = new SmallFactory(); bigfactory.produce().run(); bigfactory = new BigFactory(); bigfactory.produce().run(); }}//抽象产品intece MeizuPhone{ void run();}//具体产品*2class PRO5 implements MeizuPhone{ @Override public void run() { System.out.println("我是一台PRO5"); }}class MX5 implements MeizuPhone{ @Override public void run() { System.out.println("我是一台MX5"); }}intece IFactory{//抽象的工厂 MeizuPhone produce();}//工厂*2class BigFactory implements IFactory{ @Override public MeizuPhone produce() { return new PRO5(); }}class SmallFactory implements IFactory{ @Override public MeizuPhone produce() { return new MX5(); }}
如果了解Java的集合框架,那么它就是一个很好的例子:
Java中的Collection接口的实现都能通过iterator()方法返回一个迭代器,而不同的实现的迭代器都在该实现中以内部类的方式对Iterator接口实现的,然后通过iterator()方法返回。那么,这个iterator()方法就是一种工厂方法。
可以看到,在这里抽象产品是Iterator接口,具体产品就是Collection接口的实现中对Iterator接口的实现,构造者是Collection接口,其提供的工厂方法就是Iterator iterator();,具体构造者就是Collection的实现。而工厂方法模式的结构,也就是由前面加粗的4部分组成。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33893-3.html
你很成功但你讲的话不全是对的
伊拉克都被搞成这样了