Factory Method模式
Factory Method模式
在Template Method模式中,是在父类中规定处理的流程,在子类中实现具体的处理。而在Factory Method模式中,是用Template Method模式生成实例,父类决定实例的生成方式,但并不决定所要生成的具体类,具体的处理全部交给子类处理,这样就可以将生成实例的框架和实际负责生成实例的类解耦。
示例程序
1、Product类
是所有产品类的抽象父类,只要继承Product的类都可以在Factroy中创建实例。
package com.design.pattern4;
public abstract class Product {
public abstract void use();
}
2、Factory类
定义和实现了创建Product实例的模板方法,以及需要子类实现的抽象方法。
package com.design.pattern4;
public abstract class Factory {
//抽象方法
public abstract Product createProduct(String owner);
public abstract void registerProduct(Product product);
//模板方法,创建Product实例
public final Product create(String owner){
Product p = createProduct(owner);
registerProduct(p);
return p;
}
}
3、IdCard类(产品子类)
具体的产品类,这里通过继承Product类来通过Factory创建实例,并且构造函数Idcard并没有加修饰符,主要是为了迫使通过Factory来创建实例,而非new。
package com.design.pattern4;
public class IdCard extends Product{
private String owner;
public String getOwner() {
return owner;
}
//只有同一个包下的类才能调用此构造方法
IdCard(String owner) {
System.out.println("初始化");
this.owner = owner;
}
@Override
public void use() {
System.out.println(owner);
}
}
4、IdCardFactory(Factory子类)
和Templete Method模式中的子类一样,实现父类Factory中的抽象方法。
package com.design.pattern4;
import java.util.ArrayList;
import java.util.List;
public class IdCardFactory extends Factory{
private List<String> owners = new ArrayList<>();
public List<String> getOwners() {
return owners;
}
@Override
public Product createProduct(String owner) {
//返回具体的产品子类
return new IdCard(owner);
}
@Override
public void registerProduct(Product product) {
owners.add(((IdCard)product).getOwner());
}
}
5、Main类
package com.design.pattern4;
public class Main {
public static void main(String[] args) {
Factory factory = new IdCardFactory();
Product p1 = factory.create("张三");
Product p2 = factory.create("李四");
Product p3 = factory.create("王五");
p1.use();
p2.use();
p3.use();
}
}
Factory Method模式需要四个元素:
1、Product类
它是一个抽象类,定义了在Factory Method模式中生成的实例所持有的方法(use),但具体处理交给子类。
2、Creator(创建者)
负责生成Product实例的抽象类,但具体的处理(抽象方法)交给子类,并且,创建方法用createProduct来创建实例,而非new,很大程度上防止父类与其他具体类的耦合。
3、ConcreteProduct(具体产品)
4、ConcreteCreator(具体创建者)
实现Factory中的抽象方法,也就是生成具体的产品实例。