zoukankan      html  css  js  c++  java
  • 设计模式:简单工厂和工厂方法

    简单工厂概念

    又叫做静态工厂方法(Static Factory Method)模式,由一个工厂对象决定创建出哪一种产品类的实例。

    代码示例

    Car是要得到的目标类型,BigCar、MiniCar可能的不同具体的产品,有可能扩展。
    CarFactory定义了不同品牌Car的获取方式。

    interface Car {
      String getBrand();
    }
    
    class BigCar implements Car {
       @Override
       public String getBrand() {
           return "Big";
       }
    }
    
    class MiniCar implements Car {
       @Override
       public String getBrand() {
           return "Mini";
       }
    }
    
    class CarFactory {
      public static Car makeCar(int type) {
        switch(type) {
          case 1:
            return new BigCar();
          case 2:
            return new MiniCar();
        }
        return null;
      }
    }
    

    客户端代码使用CarFactory,传递不同的type获取不同的Car。

    void carTest() {
        // 获取car的代码-需要作出对不同type的选择
        Car car = CarFactory.makeCar(1);
    
        // 使用Car做操作的代码-无需改变
        car.getBrand();
    }
    

    解读

    工厂类是获取产品对象的地方,封装了获取不同产品对象的选择和创建细节。
    创建过程得以控制,选择返回不同的产品。

    缺点:选择和创建在一起,高内聚。不断修改。

    案例

    jdbc

    Class.forName(String driverClass);
    DataManager.getConnection(string url, String user, String pass);
    

    (本文使用Atom编写)

    工厂方法概念

    定义一个用于创建对象的接口,实现类(子类)决定要实例化的具体对象,使得对要用的类的实例化延迟到子类。

    类结构图

    工厂方法类结构图

    代码示例

    Car是要得到的目标类型,CarFactory定义了抽象的获取方式。

    interface Car {
      String getBrand();
    }
    
    interface CarFactory {
      Car makeCar();
    }
    

    BigCar是一种Car,BigCarFactory用来获取它。

    class BigCar implements Car {
       @Override
       public String getBrand() {
           return "Big";
       }
    }
    
    class BigCarFactory implements CarFactory {
    
       @Override
       public Car makeCar() {
           return new BigCar();
       }
    }
    

    在通过CarFactory获取Car并使用的代码中,唯一需要变动的地方是“选择哪个工厂类”。

    void carTest() {
        // 这里选择要使用的CarFactory
        CarFactory factory = new BigCarFactory();
    
        // 获取car的代码-无需改变
        Car car = factory.makeCar();
    
        // 使用Car做操作的代码-无需改变
        car.getBrand();
    }
    

    解读?

    当需要的产品类型要应对变化时:
    使用上,先得到一个工厂——这是唯一需要作出选择的地方,也是可能变化的地方。

    把工厂的选择交给调用者代码,而生产哪个产品对象的逻辑是工厂子类决定的。

    增加工厂类和产品类,客户端代码本身由于业务变动的起点——唯一需要修改的地方。
    符合开闭原则:对扩展开放,对修改关闭。

    (本文使用Atom编写)

  • 相关阅读:
    文件操作方法大全以及文件打开的其他一些模式sys.stdout.write()就是标准输出到你当前的屏幕 sys.stdout.flush()把内存立即显示到您当前的屏幕
    文件操作之循环
    python中的enumerate函数用于遍历序列中的元素以及它们的下标
    文件操作open,r,w,a三种模式
    盖得化工--采集所有公司详细信息
    盖得化工--采集二级网址的公司详细信息
    [python网络编程]使用scapy修改源IP发送请求
    盖得化工----requests/bs4---采集二级网址
    盖得化工--selenium翻页测试
    盖得化工网——翻页测试---页码框输入页码
  • 原文地址:https://www.cnblogs.com/everhad/p/6246604.html
Copyright © 2011-2022 走看看