工厂方法模式
**定义:*定义一共用于创建对象的接口,让子类决定将哪个类实例化,工厂方法模式使一个类的实例化延迟到其子类。
工厂方法模式类图
角色: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 对应的工厂类),而简单工厂则是传一个参数,工厂类根据参数返回产品