抽象工厂
一.模式定义:
为创建一系列的相关或者依赖的对象提供一个接口,而且无需指定他们的具体类。
二.模式特点:
是工厂方法的升级版,在涉及要创建多个相关的类对象时,是很好的解决方案。
三.使用场景:
在工厂方法的基础上,还需要创建多个相关或依赖的类时(比如产生具有性别的动物),可以使用。
四.具体实现:
1.定义基本类:这里以具有性别的动物为例子,Animal这个父类在上一章工厂方法中有提及。
//要生产雄性动物的基本抽象类
public abstract class MaleAnimal extends Animal{
//动物的名称
public abstract String name();
//动物的叫声
public abstract String sound();
//动物的性别
public String sex()
{
return "性别为:公的";
};
}
//要生产雌性动物的基本抽象类
public abstract class FemaleAnimal extends Animal{
//动物的名称
public abstract String name();
//动物的叫声
public abstract String sound();
//动物的性别
public String sex()
{
return "性别为:母的";
};
}
2.定义具体类,这里以猫狗为例子。
//具体的动物
public class MaleCat extends MaleAnimal{
@Override
public String name() {
// TODO Auto-generated method stub
return "猫";
}
@Override
public String sound() {
// TODO Auto-generated method stub
return "叫:喵喵";
}
}
//具体的动物
public class MaleDog extends MaleAnimal{
@Override
public String name() {
// TODO Auto-generated method stub
return "狗";
}
@Override
public String sound() {
// TODO Auto-generated method stub
return "叫:汪汪";
}
}
//具体的动物
public class FemaleCat extends FemaleAnimal{
@Override
public String name() {
// TODO Auto-generated method stub
return "猫";
}
@Override
public String sound() {
// TODO Auto-generated method stub
return "叫:喵喵";
}
}
//具体的动物
public class FemaleDog extends FemaleAnimal{
@Override
public String name() {
// TODO Auto-generated method stub
return "狗";
}
@Override
public String sound() {
// TODO Auto-generated method stub
return "叫:汪汪";
}
}
3.定义抽象工厂类。
//抽象工厂的定义
public abstract class AnimalFactory {
public abstract Animal getAnimal(Class c);
}
4.定义具体工厂类,由于动物具有两种性别,所以创建两种工厂。
//雄性动物工厂的定义
public class MaleAnimalFactory extends AnimalFactory{
public MaleAnimal getAnimal(Class c)
{
MaleAnimal maleAnimal = null;
try {
maleAnimal = (MaleAnimal)Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("必须指定动物类型");
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("动物定义错误");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("找不到你需要的动物");
}
return maleAnimal;
}
}
//工厂的定义
public class FemaleAnimalFactory extends AnimalFactory{
public FemaleAnimal getAnimal(Class c)
{
FemaleAnimal femaleAnimal = null;
try {
femaleAnimal = (FemaleAnimal)Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("必须指定动物类型");
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("动物定义错误");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("找不到你需要的动物");
}
return femaleAnimal;
}
}
5.使用实例。
public class main {
public static void main(String[] args)
{
MaleAnimalFactory factory1 = new MaleAnimalFactory();
//工厂生产出一只公狗
MaleAnimal dog = factory1.getAnimal(MaleDog.class);
System.out.println(dog.sex()+dog.name()+dog.sound());
//工厂生产出一只公猫
MaleAnimal cat = factory1.getAnimal(MaleCat.class);
System.out.println(cat.sex()+cat.name()+cat.sound());
FemaleAnimalFactory factory2 = new FemaleAnimalFactory();
//工厂生产出一只母狗
FemaleAnimal dog2 = factory2.getAnimal(FemaleDog.class);
System.out.println(dog2.sex()+dog2.name()+dog2.sound());
//工厂生产出一只母猫
FemaleAnimal cat2 = factory2.getAnimal(FemaleCat.class);
System.out.println(cat2.sex()+cat2.name()+cat2.sound());
}
}