工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。
工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,而现在是修改客户端!
工厂方法克服了简单工厂违背开-闭原则的缺点,有保持了封装对象创建过程的优点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。
工厂方法模式-》为每种类型的对象的创建都交给该类型对应的工厂,也就是说一种类型对应一个该类型具体的工厂,例如:要创建Dog,就使用Dog的工厂来创建Dog;要创建Cat,就使用Cat的工厂来创建。
用于创建的对象种类比较多的情况下,扩展性相对于简单工厂模式要好,扩展的时候不需要改动原先的代码,想要扩展一种动物,只需要扩展对应的工厂类。
1 public abstract class Animal { 2 public abstract void sayHello(); 3 }
1 public class Cat extends Animal{ 2 @Override 3 public void sayHello() { 4 System.out.println("hello,我是猫"); 5 } 6 }
1 public class Dog extends Animal{ 2 @Override 3 public void sayHello() { 4 System.out.println("hello,我是哈士奇"); 5 } 6 7 }
1 //工厂 2 public interface Factory { 3 public abstract Animal createAnimal(); 4 }
1 public class DogFactory implements Factory{ 2 @Override 3 public Animal createAnimal() { 4 return new Dog(); 5 } 6 7 }
1 public class CatFactory implements Factory { 2 @Override 3 public Animal createAnimal() { 4 5 return new Cat(); 6 } 7 8 }
测试类:
1 public class AnimalTest { 2 public static void main(String[] args) { 3 // 需求:找只猫 4 Factory f = new CatFactory(); 5 // 上溯造型 6 Animal animal = f.createAnimal(); 7 animal.sayHello(); 8 } 9 }
UML图:
不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练更加容易维护、容易扩展和复用,只有这样才可以真正得到提高
--《来自大话设计模式》