先说FactoryMethod
意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。将实例化推迟到子类。
这是工厂模式的类图,FactoryMethod在抽象父类中定义 在子类中实现 ,子类负责创建某产品的特定对象 ,经常的应用是在框架定义上,FactoryMethod 可以把不同集合与他的迭代器绑定起来。
package FactoryMethod;
public abstract class Factory {
abstract Product FactoryMethod();
public Product getInstance(){
return FactoryMethod();
}
public static void main(String [] args){
Factory factory =new ConcreteCreater();
System.out.print(factory.getInstance());
}
}
package FactoryMethod;
public class ConcreteCreater extends Factory{
@Override
Product FactoryMethod() {
Product product=new ConcreteProduct();
return product;
}
}
package FactoryMethod;
public class ConcreteProduct extends Product{
public ConcreteProduct(){
print();
}
@Override
void print() {
System.out.println("ConcreteProduct was producted");
}
}
package FactoryMethod;
public abstract class Product {
abstract void print();
}
如果需要有其他类型产品 那么只需在应用逻辑中加入SWITCH 或者读配置以产生正确的类型。
AbstractFactory
意图: 为客户特定的客户提供对象组。
问题 :需要实例化一组相关对象
解决方案:协调对象组的创建。提供一种方式,将如何知性对象实例化的规则从使用这些对象的客户对象提取出来
效果:这个模式将“使用哪些对象”的规则与“如何创建使用这些对象”的逻辑分离开
实现 :定义一个抽象类来指定创建哪些对象。然后为每个组实现一个具体类。可以用表或文件完成同样的任务。
类图如下
这个模式被称为AbstractFactory 是因为 它创建的物品本身是抽象的,也就是例子中的productA productB。
在最经常的实现中 AbctractFactory对英语factorymethod的抽象层 ConcreteFactory 对应与实现层,AbctractFactory中的每个创建函数都对应于一个工厂方法。
Client值负责使用工厂的产品而不负责创建 ,AbstractFactory 则负责创建对象。 实现了创建与应用逻辑的分离