工厂方法模式概述
工厂方法模式中"抽象工厂类"负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的"具体类"实现。
A:优点
(1)客户端不需要再负责对象的创建,从而明确了各个类的职责;
(2)如果有新的对象增加,只需要增加"一个具体的类和具体的工厂类"即可,不影响已有的代码,后期"维护"容易,增强了系统的扩展性
说明:优点2也是与静态工厂模式相比的优点(可以理解是对静态工厂模式的一个优化)
B:缺点: 需要额外的编写代码,增加了工作量
设计上:抽象工厂类不负责创建具体的对象,而是提供一个模板,由继承该抽象工厂类的子具体工厂类来实现,如果有新对象的添加,只需要添加一个具体的类和具体的工厂类即可
具体实现:提前定义用于创建对象的接口(抽象工厂),让子类(子工厂)决定实例化具体的某一个类,总厂只负责调度,具体创建由自工厂生产;即:在工厂和具体产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。
例1
AnimalFactory
package www.wzj.factorymethod;
public interface AnimalFactory {
Animal createAnimal();//接口默认是public static
}
Animal
package www.wzj.factorymethod;
public abstract class Animal {
public abstract void eat();//抽象类
}
CatFactory
package www.wzj.factorymethod;
public class CatFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
}
DogFactory
package www.wzj.factorymethod;
public class DogFactory implements AnimalFactory {
public Animal createAnimal(){
return new Dog();
}
}
Cat
package www.wzj.factorymethod;
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
Dog
package www.wzj.factorymethod;
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗啃狗头");
}
}
Test
package www.wzj.factorymethod;
public class Test {
public static void main(String[] args) {
AnimalFactory animalFactory = new DogFactory();//(1)得到实际工厂类的对象
Animal animal = animalFactory.createAnimal();//(2)用具体的工厂类创建具体的对象
animal.eat();//具体类的方法
new CatFactory().createAnimal().eat();
}
}
抽象工厂模式(也叫工具箱)---后续补充