您的位置:首页 > 其它

工厂方法模式

2016-07-14 09:03 274 查看
 
      工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

工厂方法模式(Factory Method):定义一个用于创建对象的接口IFactory,在具体的ConcreteFactory子类
中根据传进的参数即具体子类ConcreteProduct决定实例化哪一个IProduct产品,该模式使得一个类(即IProduct)
的实例化延迟到其子类(即ConcreteProduct)。
结构图:

具体代码:
// 产品接口,定义一系列产品应该实现的服务,即产品的共性
interface IProduct {
public void method01();
public void method02();
}

// 具体的产品实现类
class ConcreteProductA implements IProduct {
public void method01() {
System.out.println("ConcreteProductA method01() ...");
}
public void method02() {
System.out.println("ConcreteProductA method02() ...");
}
}

class ConcreteProductB implements IProduct {
public void method01() {
System.out.println("ConcreteProductB method01() ...");
}

public void method02() {
System.out.println("ConcreteProductB method02() ...");
}
}

// 抽象的工厂类,定义了其子类必须实现的createProduct()方法
abstract class Factory {
//运用了Java 中的泛型和反射技术
public abstract <T extends IProduct> T createProduct(Class<T> c);
}

class ConcreteFactory extends Factory {
public <T extends IProduct> T createProduct(Class<T> c) {
T product = null;
try {
product = (T) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return product;
}
}

public class Client {
public static void main(String[] args) {
//创建一个具体工厂
Factory factory = new ConcreteFactory();
//根据参数中具体产品的.class名称来决定创建的产品类型
IProduct product01 = factory.createProduct(ConcreteProductA.class);
IProduct product02 = factory.createProduct(ConcreteProductB.class);

product01.method01();
product01.method02();
product02.method01();
product02.method02();
}
}


实际上,具体的产品子类(即ConcreteProduct)可以有多个,以上只用了两个;而且具体的工厂(即ConcreteFactory)
也可以有多个,不同的工厂可以提供不同的创建产品的实现方式,即使用不同的方式来覆盖实现父类中的抽象createProduct()方法。
我们可以将工厂方法模式中的产品理解为对外的服务,而IProduct接口仅仅只是制定一个标准,即每个产品(服务)
必须对外提供的接口(这个“接口”是概念上的,不是上面那种编程语言级别的关键字interface“接口”)。

总结:

工厂方法模式: 

一个抽象产品类,可以派生出多个具体产品类。 

一个抽象工厂类,可以派生出多个具体工厂类。 

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式: 

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 

一个抽象工厂类,可以派生出多个具体工厂类。 

每个具体工厂类可以创建多个具体产品类的实例。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: