设计模式第二讲:工厂方法

工厂方法

一.模式定义

定义一个可以创建不同子类的入口方法,由使用者来决定创建哪个类。


二.模式特点

将客户端从具体类型中解耦,客户端只需要知道他们所使用对象的抽象类型即可,而不必关心具体的对象类型如何实现。


三.使用场景

(1)当子类型可能会创建很多,并且需要添加更多的子类; 

(2)还未明确需要实例化的具体类,处于设计阶段;

(3)还没有具体对象的概念.


四.具体实现

1.定义工厂要生产的物品抽象类

//要生产动物的基本抽象类
public abstract class Animal {

	//动物的名称
	public abstract String name();
	
	//动物的叫声
	public abstract String sound();
	
}


2.定义工厂要生产的物品具体类

//具体的动物
public class Dog extends Animal{

	@Override
	public String name() {
		// TODO Auto-generated method stub
		return "狗";
	}

	@Override
	public String sound() {
		// TODO Auto-generated method stub
		return "叫:汪汪";
	}

}

//具体的动物
public class Cat extends Animal{

	@Override
	public String name() {
		// TODO Auto-generated method stub
		return "猫";
	}

	@Override
	public String sound() {
		// TODO Auto-generated method stub
		return "叫:喵喵";
	}

}

//具体的动物
public class Fish extends Animal{

	@Override
	public String name() {
		// TODO Auto-generated method stub
		return "鱼";
	}

	@Override
	public String sound() {
		// TODO Auto-generated method stub
		return "不会叫";
	}

}


3.定义工厂

//工厂的定义
public class AnimalFactory {

	public static Animal getAnimal(Class c)
	{
		Animal animal = null;
		try {
			animal = (Animal)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 animal;
	}
}


4.使用工厂生产各种物品

public class main {

	public static void main(String[] args)
	{
		//工厂生产出一只狗
		Animal dog = AnimalFactory.getAnimal(Dog.class);
		System.out.println(dog.name()+dog.sound());
		//工厂生产出一只猫
		Animal cat = AnimalFactory.getAnimal(Cat.class);
		System.out.println(cat.name()+cat.sound());
		//工厂生产出一条鱼
		Animal fish = AnimalFactory.getAnimal(Fish.class);
		System.out.println(fish.name()+fish.sound());
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值