image.png
    在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事务最抽象的定义。
    Creator为抽象创建类,抽象工厂,具体如何创建产品类由具体的实现工厂ConcreteCreator完成。

    通用的模板:

    1. public abstract class Product{
    2. public void method1(){
    3. //业务逻辑
    4. }
    5. public abstract void method2();
    6. //抽象方法
    7. }
    8. public class ConcreteProduct1 extends Product{
    9. public void method2(){
    10. //业务逻辑处理
    11. }
    12. }
    13. public class ConcreteProduct2 extends Product{
    14. public void method2(){
    15. //业务逻辑处理
    16. }
    17. }
    18. public class Creator{
    19. public abstract <T extends Product> T createProduct(Class<T> c);
    20. }
    21. public class ConcreteCreator extends Creator{
    22. public <T extends Product> T createProduct(Class<T> c){
    23. Product p=null;
    24. try{
    25. p=(Product)Class.forName(c.getName()).newInstance();
    26. }catch(Exception e){
    27. //异常处理
    28. }
    29. return (T)p;
    30. }
    31. }
    1. public class Client{
    2. public static void Main(String[] args){
    3. Creator creator=new ConcreteCreator();
    4. Product product=creator.createProduct(ConcreteProduct1.class);
    5. //继续业务处理
    6. }
    7. }

    工厂方法模式的优点

    1. 良好的封装性,代码结构清晰。
    2. 扩展性很优秀,能够很好地拥抱变化,比如增加一个新的ConcreteProduct3,只需要增加一个子类,不需要修改Product和工厂的代码。
    3. 屏蔽产品类,产品类如何变化,调用者都不需要去关心

    工厂模式是典型的解耦框架。高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我不需要的就不要去交流;也符合依赖倒置法则,只依赖产品类的抽象;也符合里氏替换原则,使用产品子类替换父类。