前面一篇文章已经详细的介绍了简单工厂模式。如果没有读过可以先了解一下简单工厂模式。
看到最后我们会发现通过传入参数给工厂类来生产相应的电视产品还是有一些弊端的,具体体现在当我们需要增加一个创维电视类的时候这时候我们不光要添加一个创维电视类,还得修改咱们的工厂类。这样的话就违反了咱们设计模式中提到的开闭原则了。为了使我们的生产电视这一设计模式更具有延展性,这里就该工厂方法模式也就是一般工厂模式出场了。
相比简单工厂模式,一般工厂模式不光设计了抽象的电视基类,也同时设计了抽象的工厂父类,每类电视都有一个具体的工厂类生产,而每个具体的工厂只需要继承他们抽象的工厂父类。
通过上面的实例类图我们就可以在Client类中实现乐视电视工厂生产乐视电视,小米电视工厂生产小米电视。
这里的ITV抽象类跟前面一篇文章中是一样的,咱们这边一般抽象工厂模式主要修改的是工厂类这一块。
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. * * 这里是一个抽象类,这里有获取价格以及生产过程这两个抽象方法 */ public abstract class ITV { /** * price方法定义每台电视的售价,具体的售价由其子类来实现 */ public abstract void price(); /** * 描述了每台电视的生产过程,具体的生产过程由其子类实现 */ public abstract void produceProcess(); }
抽象的父类中有price和produceProcess两个方法,分别用来定义每台电视的价格以及电视的生产过程。接着咱们分别来写他的三个子类。
LeTV
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public class LeTV extends ITV { @Override public void price() { System.out.println("乐视超级电视每台售价5000元"); } @Override public void produceProcess() { System.out.println("乐视电视生产过程由部分国产代工厂以及富士康代工"); } }
MiTV
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public class MiTV extends ITV { @Override public void price() { System.out.println("小米电视每台售价4999元"); } @Override public void produceProcess() { System.out.println("小米电视的生产由富士康代工"); } }
HisenseTV
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public class HisenseTV extends ITV { @Override public void price() { System.out.println("海信电视每台售价10000元"); } @Override public void produceProcess() { System.out.println("海信电视由自家工厂生产"); } }
接着咱们来看一下ITVFactory这个抽象的工厂父类。
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public abstract class ITVFactory { /** * 该方法可以通过传入的参数来生产相应的电视 * @return: 返回相应的电视类 */ public abstract ITV createTV(); }
再来看一下这个抽象工厂父类的三个子类。
LeTVFactory
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public class LeTVFactory extends ITVFactory { @Override public ITV createTV() { return new LeTV(); } }
MiTVFactory
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public class MiTVFactory extends ITVFactory { @Override public ITV createTV() { return new MiTV(); } }
HisenseTVFactory
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public class HisenseTVFactory extends ITVFactory { @Override public ITV createTV() { return new HisenseTV(); } }
最后咱们再来看看Client类中怎么调用不同的工厂类来生产相应的电视的
package com.weiyu.factory; /** * Created by Sam on 7/14/2016. */ public class Client { public static void main(String[] args){ ITVFactory leTVFactory = new LeTVFactory(); ITVFactory miTVFactory = new MiTVFactory(); ITVFactory hisenseTVFactory = new HisenseTVFactory(); ITV letv = leTVFactory.createTV(); ITV mi = miTVFactory.createTV(); ITV hisense = hisenseTVFactory.createTV(); //获取三个电视的生产过程 letv.produceProcess(); mi.produceProcess(); hisense.produceProcess(); System.out.println("----------------------------------------------------"); //获取三台电视的售价 letv.price(); mi.price(); hisense.price(); } }
从该类中就可以看出可以调用乐视工厂类来生产乐视电视,这样类的职责就比较分明。同时,当我们需要新增加一个类的时候只需要增加一个电视类以及相应的工厂类,这样就不用修改原有的工厂方法,即做到了开闭原则。
从最后的结果我们可以看到每个电视类有不同的生产过程以及生产方法。接下来一篇我们会继续分析抽象工厂模式。