工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定创建哪个类的实例。
适用场景:需要灵活的,可扩展的框架时。
具体实现(factory):
通用工厂 (这里使用动物作为产品类,则每种动物都会叫,且叫声不同)
创建动物抽象类:
public abstract class Animal {
public void method(){ //子类通用方法
}
public abstract void say(); //子类自己实现的方法
}
创建cat类实现Animal动物类:
public class Cat extends Animal {
@Override
public void say() {
System.out.println("喵~~~~~~~");
}
}
创建dog类实现Animal动物类
public class Dog extends Animal{
@Override
public void say() {
System.out.println("汪~~~~~~~~");
}
}
创建抽象动物工厂类
public abstract class AbstractAnimalFactory {
//限制输入参数必须是Class类型,且必须是Animal的实现类。
public abstract <T extends Animal> T createAnimal(Class<T> c);
}
实现动物工厂类
public class AnimalFactory extends AbstractAnimalFactory{
@Override
public <T extends Animal> T createAnimal(Class<T> c) {
Animal animal = null;
try {
animal= (Animal) Class.forName(c.getName()).newInstance();
}catch (Exception e){
//异常处理
}
return (T) animal;
}
}
创建场景类测试
public class Client {
public static void main(String[] args) {
AbstractAnimalFactory abstractAnimalFactory = new AnimalFactory();
Animal cat = abstractAnimalFactory.createAnimal(Cat.class);
cat.say();
Animal dog = abstractAnimalFactory.createAnimal(Dog.class);
dog.say();
}
}
简单工厂(也叫静态工厂。不需要抽象工厂类,直接使用工厂类,且将创建方法修改为静态;实现简单,但是不易拓展)
修改工厂类
public class AnimalFactory {
public static <T extends Animal> T createAnimal(Class<T> c) {
Animal animal = null;
try {
animal= (Animal) Class.forName(c.getName()).newInstance();
}catch (Exception e){
//异常处理
}
return (T) animal;
}
}
修改场景测试类
public class Client {
public static void main(String[] args) {
Animal cat = AnimalFactory.createAnimal(Cat.class);
cat.say();
Animal dog = AnimalFactory.createAnimal(Dog.class);
dog.say();
}
}
多工厂类(为每个具体的动物都创建一个工厂类,结构简单,但是系统复杂时会非常麻烦,不易拓展)
修改抽象动物工厂类
public abstract class AbstractAnimalFactory {
public abstract Animal createAnimal();
}
创建cat工厂类
public class CatFactory extends AbstractAnimalFactory{
@Override
public Animal createAnimal() {
return new Cat();
}
}
创建dog工厂类
public class DogFactory extends AbstractAnimalFactory{
@Override
public Animal createAnimal() {
return new Dog();
}
}
修改场景测试类
public class Client {
public static void main(String[] args) {
Animal cat = new CatFactory().createAnimal();
cat.say();
Animal dog = new DogFactory().createAnimal();
dog.say();
}
}