工厂方法模式
场景:
我如今有一个动物体系 全部的动物都要吃饭
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,这样就能够啦!
工厂方法的优缺点:
在工厂方法模式中,client不在负责对象的创建。而且当有新的子类加入的时候。我们仅仅须要加入一个子类,和一个子类的工厂类,不须要改动曾经的结构代码。后期更easy维护,增强了扩展性。缺点就是额外的写了很多其它的代码。
。。。