• 【大话设计模式】工厂方法模式


    【工厂方法模式】

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

     

    【简单工厂 与 工厂方法 比较】

    【简单工厂的特点】简单工厂的工厂类中包含,包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

    以计算器为例,在客户端只要把‘+’传给工厂,工厂就给出了相应的实例,客户端只要做运算即可。

    【简单工厂的缺陷】但是,如果要增加一个功能,就需要在工厂类的方法里加分支条件,修改原有的类。

    这就等于说,不但对拓展开放,而且对修改也开放,违背了开放-封闭原则。

    【使用工厂方法】根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂实现这个接口。

    这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂。

    如果要增加新功能,只需要增加此功能的运算类和相应的工厂类。这样就符合开发-封闭原则。

    工厂方法模式实现时,客户端需要决定实例化哪一个工厂,所以工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。

    【工厂方法的优点】工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但是增加了额外的开发量。

    【简单工厂模式】实现计算类

    1. class OperationFactory{
    2. public static Operation createOperate(String operate){
    3. Operation oper = null;
    4. swtich(operate){
    5. case "+":
    6. oper = new OperationAdd();
    7. break;
    8. case "-":
    9. oper = new OperationSub();
    10. break;
    11. case "*":
    12. oper = new OperationMul();
    13. break;
    14. case "/":
    15. oper = new OperationDiv();
    16. break;
    17. }
    18. return oper;
    19. }
    20. }
    1. Operation oper;
    2. oper = OperationFactory.createOperate("+");

    【工厂模式实现计算类】

    1. public interface Ifactory{
    2. Operation CreateOperation();
    3. }
    4. public class AddFactory implements IFactory{
    5. @Override
    6. public Operation CreateOperation(){
    7. return new OperationAdd();
    8. }
    9. }
    10. public class SubFactory implements IFactory{
    11. @Override
    12. public Operation CreateOperation(){
    13. return new OperatioSub();
    14. }
    15. }
    16. public class MulFactory implements IFactory{
    17. @Override
    18. public Operation CreateOperaton(){
    19. return new OperationMul();
    20. }
    21. }
    22. public class DivFactory implements IFactory{
    23. @Override
    24. public OPeration CreateOperation(){
    25. return new OperationDiv();
    26. }
    27. }
    1. IFactory operFactory = new AddFactory();
    2. OPeration oper = operFactory.CreateOperation();

  • 相关阅读:
    Threejs 3D模型入门项目
    题目0078-洞穴探险
    Pytorch中loss.backward()和torch.autograd.grad的使用和区别(通俗易懂)
    Echarts-实现3D柱状图
    抓包分析RST报文
    数字化升级里,RPA的下一步正在走向哪?
    springboot新冠疫苗预约系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT
    About 8.14 This Week
    4. 【自动驾驶与机器人中的SLAM技术】点云中的拟合问题和K近邻
    java-php-net-python-房产交易资金管理系统计算机毕业设计程序
  • 原文地址:https://blog.csdn.net/m0_52043808/article/details/126619528