赞
踩
**定义:*定义一共用于创建对象的接口,让子类决定将哪个类实例化,工厂方法模式使一个类的实例化延迟到其子类。
角色:1.抽象产品(Product)2.抽象工厂(Factory)3.具体产品(ConcreteProduct)4.具体工厂(ConcreteProduct)
与简单工厂类似,不过将工厂类抽象化,这样做的好处是使得客户端只需要关心抽象产品和抽象工厂,完全不用理会返回的是哪一种具体产品,也无需关心是如何被具体工厂创建的,同时在新增一个产品时,只需要添加一共具体工厂和具体产品即可。这样满足开闭原则。缺点是可能会产生大量的类,增加系统的开销。
优点:
(1)工厂方法模式减轻了工厂类的负担,把某一类/某一种东西指定一个工厂进行生产使得每个工厂职责清晰;
(2)当要增加某一类”东西“并不需要修改工厂类,只需要增加这类”东西“的工厂即可,符合开放-封闭原则。
缺点:
(1)由于每增加一个产品就得相应的增加工厂,对于某些可以形成产品族的情形,不便于代码可扩展和可维护
将原有的工厂进行分割,为每种品牌的电视机提供一个子工厂, 海尔工厂专门负责生产海尔电视机, 海信工厂专门负责生产海信电视机, 如果需要生产TCL电视机或创维电视机,只需要对应增加一个新的TCL工厂或创维工厂即可,原有的工厂无须做任何修改,使得整个系统具有更加的灵活性和可扩展性。绘制类图并给出完整代码及运行结果。
可以看出原来的工厂变为了一个创建对象的接口,而TCL电视厂、海尔工厂作为子类决定了具体的生产产品,所以该设计模式为工厂方法模式。
Client依赖与电视工厂与电视产品两个抽象类,两个抽象类分别由两个具体类来实现
public interface TVFactory { public TV produceTV();} public class HaierTVFactory implements TVFactory { public TV produceTV() { System.out.println("海尔电视机工厂生产海尔电视机。"); return new HaierTV(); } } public class HisenseTVFactory implements TVFactory { public TV produceTV() { System.out.println("海信电视机工厂生产海信电视机。"); return new HisenseTV(); } } public interface TV { public void play();} public class HaierTV implements TV { public void play() { System.out.println("海尔电视机播放中......"); } } public class HisenseTV implements TV { public void play() { System.out.println("海信电视机播放中......"); } } public class Client { public static void main(String args[]) { TV tv; TVFactory factory; factory=new HaierTVFactory(); tv=factory.produceTV(); tv.play(); } }
工厂方法模式主要新增了抽象工厂,和简单工厂不同的是,将创建对象的职责交给客户端(new 对应的工厂类),而简单工厂则是传一个参数,工厂类根据参数返回产品
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。