工厂方法
一.模式定义
定义一个可以创建不同子类的入口方法,由使用者来决定创建哪个类。
二.模式特点
将客户端从具体类型中解耦,客户端只需要知道他们所使用对象的抽象类型即可,而不必关心具体的对象类型如何实现。
三.使用场景
(1)当子类型可能会创建很多,并且需要添加更多的子类;
(2)还未明确需要实例化的具体类,处于设计阶段;
(3)还没有具体对象的概念.
四.具体实现
1.定义工厂要生产的物品抽象类
//要生产动物的基本抽象类
public abstract class Animal {
//动物的名称
public abstract String name();
//动物的叫声
public abstract String sound();
}
//要生产动物的基本抽象类
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 "不会叫";
}
}
//具体的动物
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;
}
}
//工厂的定义
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());
}
}