工厂方法模式
场景:
我现在有一个动物体系 所有的动物都要吃饭
Animal
|---AnimalFactory
|---Cat
|---Dog
代码如下:
/**
* 这是一个动物抽象类
*
*/
public abstract class Animal {
/**
* 吃的行为
*/
public abstract void eat();
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
如果还是像上一篇简单工厂这么写,那么还是不能不能避免最后出现的一个问题-----违反了开闭原则。现在对上面的体系进行一下改进。
Animal
|---AnimalFactory
|---Cat
|--CatFactory
|---Dog
|--DogFactory
代码如下:
动物工厂类
public abstract class AnimalFactory {
public abstract Animal creatAnimal();
}
public class CatFactory extends AnimalFactory {
@Override
public Animal creatAnimal() {
return new Cat();
}
}
狗工厂
public class DogFactory extends AnimalFactory {
@Override
public Animal creatAnimal() {
return new Dog();
}
}
public class Test {
public static void main(String[] args) {
AnimalFactory af=new CatFactory();
Animal cat = af.creatAnimal();
cat.eat();
AnimalFactory af2 = new DogFactory();
Animal dog = af2.creatAnimal();
dog.eat();
}
}
这个时候如果有一个新的子类添加,那么该怎么解决呢?
比如我们需要添加一个PIg类,那么我们可以先把Pig造出来,然后为他写一个PigFactory,这个PigFactory继承自AnimalFactory,这样就可以啦!
工厂方法的优缺点:
在工厂方法模式中,客户端不在负责对象的创建,并且当有新的子类添加的时候,我们只需要添加一个子类,和一个子类的工厂类,不需要修改以前的结构代码,后期更容易维护,增强了扩展性,缺点就是额外的写了更多的代码。。。。