设计模式第三讲:抽象工厂

抽象工厂

一.模式定义:

    

为创建一系列的相关或者依赖的对象提供一个接口,而且无需指定他们的具体类。

二.模式特点:

是工厂方法的升级版,在涉及要创建多个相关的类对象时,是很好的解决方案。

三.使用场景:

在工厂方法的基础上,还需要创建多个相关或依赖的类时(比如产生具有性别的动物),可以使用。

四.具体实现:

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());
	}
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值