Abstract工厂模式在日常工作中比较常见,往往使用该模式的目的是为了简化客户端的应用。对于一系列的子类,客户端不必要分别创建每个子类,而是直接处理超类(该超类一般为借口或者抽象类)。而实例化具体的类则推迟到子类工厂中进行,从而当子类改变时,客户端并不知道,因为它 是对超类进行处理的。
具体使用场合,Design Pattern总结如下:
1. 系统应该对相应子类的构建、组合和代表的含义独立
2. 系统应该在多个产品组合中配置其中一个
3.相关产品应该组合在一起使用
4.提供产品库类的集合时,你需要展示接口而不是实现时。
需要注意的是,Factory往往设计为单例模式。
具体实例:
该类中,Abstract Factory有两个具体的工厂实现:MaleCreate,和FemaleCreate
Human 的两个子类FemaleHuman, MaleHuman,
Animal的两个子类FemalAnimal, MaleAnimal
其中,MaleCreate产生Human的MaleHuman, Animal的MaleHuman子类
FemalCreate产生Human的FemalHuman, Animal 的FemalHuman子类
package net.liuyx.test;
public interface AbstractLivingFactory {
public Human createHuman();
public Animal createAnimal();
public static class Test{
public static void main(String[] args){
AbstractLivingFactory alf = new MaleCreate();
Human h = alf.createHuman();
Animal a = alf.createAnimal();
System.out.println(h + "<<<<<< " + a);
System.out.println("=============");
AbstractLivingFactory alf = new FemalCreate();
Human h1 = alf.createHuman();
Animal a1 = alf.createAnimal();
System.out.println(h1 + ">>>>>> " + a1);
}
}
}
class MaleCreate implements AbstractLivingFactory{
public Human createHuman(){
return new Human.MaleHuman();
}
public Animal createAnimal(){
return new Animal.MaleAnimal();
}
}
class FemalCreate implements AbstractLivingFactory{
public Human createHuman(){
return new Human.FemalHuman();
}
public Animal createAnimal(){
return new Animal.FemalAnimal();
}
}
abstract class Human{
static class FemalHuman extends Human{
@Override
public String toString() {
return "FemalHuman ";
}
}
static class MaleHuman extends Human{
@Override
public String toString() {
return "MaleHuman ";
}
}
}
abstract class Animal{
static class FemalAnimal extends Animal{
@Override
public String toString() {
return "FemalAnimal";
}
}
static class MaleAnimal extends Animal{
@Override
public String toString() {
return "MaleAnimal";
}
}
}
输出结果为:
MaleHuman <<<<<< MaleAnimal
=============
FemalHuman >>>>>> FemalAnimal