设计模式之工厂方法模式(Factory Method)

  今天来介绍工厂方法模式,工厂方法(Factory Method)模式的意义在于定义一个创建工厂类的一个抽象工厂类(接口),具体的工厂类都实现这个抽象的工厂类,这里定义成接口,也就是所有具体的工厂实现类都要实现这个抽象的工厂类,之后再定义一个实际需求当中需要被创建的的对象的父类,此处这个父类也定义成接口。

工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

如果闲介绍的墨迹直接看红色部分

工厂方法模式角色与结构

类图如下:

Factory Method

抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。  具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。  抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。

  具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

实例代码如下:

抽象工厂

package com.pattern.FactoryMethod;

public interface Creator {

/**

* 工厂方法

*/

public Product factory();

}


抽象产品
package com.pattern.FactoryMethod;

public interface Product {

}

具体工厂1
package com.pattern.FactoryMethod;

public class ConcreteCreator1 implements Creator {

public Product factory() {
return new ConcreteProduct1();
}

}

具体工厂2
package com.pattern.FactoryMethod;

public class ConcreteCreator2 implements Creator {

public Product factory() {
return new ConcreteProduct2();
}

}

实际产品1
package com.pattern.FactoryMethod;

public class ConcreteProduct1 implements Product{
public ConcreteProduct1() {
// do something
}
}

实际产品2
package com.pattern.FactoryMethod;

public class ConcreteCreator2 implements Creator {

public Product factory() {
return new ConcreteProduct2();
}

}

客户端
package com.pattern.FactoryMethod;

public class Client {
private static Creator creator1,creator2;
private static Product prod1,prod2;

/**
* @param args
*/
public static void main(String[] args) {
creator1 = new ConcreteCreator1();
prod1 = creator1.factory();
creator2 = new ConcreteCreator2();
prod2 = creator2.factory();
}

}

白话文,再白话一遍工厂方法模式
接上文的简单工厂,以 张三、李四、王五 球类比赛为例
想在是踢足球踢的好的不只张三一个人了,有好多个张三踢的都好,并且组成了一个牛逼的队伍,有好多个类似张三的人,同理,足球、篮球也都一样,都出现了好多牛逼的人,这时候学校就不能单方面的指派他们中的某一个人代表学校去参加比赛,这时候就需要没中球有个专门的管理人员由每种球类的管理员来挑选他们这个牛逼的队伍中谁来应对这场意义深刻的比赛,不难看出,这时候管理员代表的意义就为具体的工厂类,负责造具体的球员,当然球员不是他造的是他来选的,这时候就会有3个管理员,即三个具体的工厂类,而球员呢有一个共性,就是都为学生,都为某牛逼学校的学生,所以这些学生就相当与了产品,这样当要出去比赛时候,学校就会委派特定的管理员进行挑选牛逼人参赛,代码跟上面的差不多,套用即可,当有需要篮球对决的时候,篮球管理员就出来挑选自己的爱将出阵。

工厂方法模式优缺点:
优点:
多态性:客户代码可以做到与特定应用无关,适用于任何实体类
子类可以重新新的实现,也可以继承父类的实现。加一层间接性,增加了灵活性。
良好的封装性,代码结构清晰。扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”屏蔽产品类。产品类的实现如何变化,调用者不需要关心,只需要关心产品的接口,只要接口保持不变,系统的上层模块就不会发生变化。
耦合度低,高层模块只需要知道产品的抽象类,其他的实现都不需要关心。

缺点:需要Creator和相应的子类作为工厂方法的载体,如果应用模型确实需要creator和子类的存在,则很好,反之需要增加一个类的层次。

猜你喜欢

转载自it4cat.iteye.com/blog/1613915