①介绍
工厂方法(Factory Method)模式是一种创建型模式,它提供了一种创建对象的最佳方式。
在工厂方法模式中,我们定义了一个抽象工厂类来负责创建具体的对象,而在具体的工厂子类中实现了这个抽象工厂类,返回一个具体的对象。
这样,当我们需要创建一个对象时,我们只需要使用具体工厂子类来创建即可,而不需要直接使用new 运算符。这样可以隐藏创建对象的复杂过程,并且可以使系统更灵活,因为可以在运行时更换具体的工厂类。
1. public interface Animal { 2. void speak(); 3. } 4. 5. public class Dog implements Animal { 6. @Override 7. public void speak() { 8. System.out.println("Woof!"); 9. } 10. } 11. 12. public class Cat implements Animal { 13. @Override 14. public void speak() { 15. System.out.println("Meow!"); 16. } 17. } 18. 19. public interface AnimalFactory { 20. Animal createAnimal(); 21. } 22. 23. public class DogFactory implements AnimalFactory { 24. @Override 25. public Animal createAnimal() { 26. return new Dog(); 27. } 28. } 29. 30. public class CatFactory implements AnimalFactory { 31. @Override 32. public Animal createAnimal() { 33. return new Cat(); 34. } 35. } 36. 37. public class Main { 38. public static void main(String[] args) { 39. AnimalFactory factory = new DogFactory(); 40. Animal animal = factory.createAnimal(); 41. animal.speak(); // Outputs: "Woof!" 42. } 43. }
在这个示例中,定义了一个Animal 接口和两个实现了这个接口的类,Dog 和 Cat。还定义了一个AnimalFactory 接口,这是一个抽象工厂类,它负责创建 Animal 类型的对象。
然后定义了两个实现了 AnimalFactory 接口的类,DogFactory 和 CatFactory,这两个类分别负责创建 Dog 和 Cat 对象。
在main 方法中,创建了一个 DogFactory 对象,然后调用它的 createAnimal 方法来创建一个 Animal 类型的对象。这样,就可以使用工厂方法来创建对象,而不用直接使用 new 运算符。
②优缺点
工厂方法模式适用的情况:当系统中涉及的对象较少,并且它们之间的关系不是很复杂时。在这种情况下,使用工厂方法模式可以使代码结构清晰,方便维护。
工厂方法模式的优点:当客户端不需要知道所创建的对象的细节时。通过使用工厂方法模式,可以隐藏对象创建的细节,使得客户端不需要关心对象是如何创建的。
工厂方法模式的缺点:增加了系统的复杂度
因为客户端需要知道所有的具体工厂类才能使用它们。
如果系统中增加新的产品,需要修改抽象工厂类和所有的具体工厂类,这违背了“开闭原则”。
如果系统中涉及的对象较多,或者它们之间的关系比较复杂,那么可能需要使用其他的创建型模式。