工厂方法模式设计模式浅谈工厂方法经常用在以下两种情况中:第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。JavaCollection中的iterator()方法即属于这种情况。第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。工厂模式的定义工厂方法模式(FactoryMethod)的意义就是是定义一个用来创建产品对象工厂的接口,然后将所要完成的工作交给子类运行。使得核心工厂类不再对产品进行创建,这样核心类就成为了一个类似抽象工厂的角色,只提供子类所要创建的对象的借口,这样做的目的是使得工厂方法模式可以使系统在不改变工厂角色的情况下引进其他新的产品。工厂方法模式其实是简单工厂模式的衍生,完善了许多简单工厂模式的缺点,解决了许多简单工厂模式的问题。工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的工厂类或者接口,这个类将不再负责详细的产品生产,详细的生产工作由工厂的子类去完成实现。在样的模式中,工厂类和产品类一般可以相对应。就是一个抽象工厂对应一个抽象的产品,一个具体工厂对应一个具体产品。工厂方法模式是最典型的模板方法模式应用。工厂方法模式角色与结构抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。具体工厂(ConcreteCreator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。优点有(1)用户只需要关心所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名。(2)它能够使工厂方可以自主确定创建何种产品对象,而如何创建这个对象的细节则完美封装在具体共产内部。(3)工厂方法模式可以使系统在不改变工厂角色的情况下引进其他新的产品。缺点添加新产品是,需要编写新的具体产品类,还要提供与之对应的具体工厂类,系统中类的个数将成对增加,会给系统带来额外的开销。对工厂方法模式与简单工厂模式对比工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。工厂方法模式退化后可以变得很像简单工厂模式。实例介绍宝马工厂生产宝马汽车,奔驰工厂生产奔驰汽车使用工厂,使用工厂模式模拟场景,绘制相应类图用java实现。工厂方法模式的一优点在于增加新的产品类无需修改现有系统,所以先创建抽象产品类autocar,在对抽象产品类进行实例化,即具体产品类BMWautocar和具体产品类Benzautocar;在创建抽象工厂类autocarFactory,在对抽象工厂类进行实例化,即具体工厂类BMWautocarFactory和具体工厂类BenzautocarFactory。建创建对象的任务委托给多个工厂子类的某一个,客户端在使用是可以无需关心是哪一个工厂创建的产品子类实例代码及解释(1)抽象产品类汽车autocar;autocar作为抽象产品类,它可以是一个接口,也可以是一个抽象类,其中包含了所有产品都具有的业务方法yunxing()行驶;(2)具体产品类BMWautocar(宝马汽车类)BMWautocar是抽象产品autocar的接口子类,它是一种具体产品,实现了在autocar接口中定义的业务方法yunxing()行驶;(3)具体产品类Benzautocar(奔驰汽车类)Benzautocar是抽象产品autocar的另一个接口子类,与上一个相似。(4)抽象工厂类autocarFactory(汽车工厂类)autocarFactory是抽象工厂类,它可以是一个接口,也可以是一个抽象类,它包含了抽象的工厂方法productautocar,返回一个抽象产品autocar类型的对象。(5)具体工厂类BMWautocarFactory(宝马汽车工厂类)BMWautocarFactory是具体工厂类,它是抽象工厂类autocarFactory的子类,实现了抽象工厂方法productautocar();在工厂方法中创建并返回一个对象的具体产品。(6)具体工厂类BenzautocarFactory(奔驰汽车工厂类)(7)辅助代码总结与思考工厂方法模式扩展使用多个工厂方法在抽象工厂角色中定义多个方法,让具体工厂角色实现这些不同的工厂方法。产品对象的重复使用调用产品类的构造函数创建一个新的产品实例,然后将这个实例提供给客户端多态性的丧失和模式的退化一个工厂模式方法的实现依赖于工厂角色和产品的多态性。