前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式:简单工厂和工厂方法

设计模式:简单工厂和工厂方法

作者头像
用户1172465
发布2018-01-08 14:29:52
5160
发布2018-01-08 14:29:52
举报
文章被收录于专栏:everhadeverhad

简单工厂概念

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

代码示例

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
void carTest() {
    // 获取car的代码-需要作出对不同type的选择
    Car car = CarFactory.makeCar(1);

    // 使用Car做操作的代码-无需改变
    car.getBrand();
}

解读

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

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

案例

jdbc

代码语言:javascript
复制
Class.forName(String driverClass);
DataManager.getConnection(string url, String user, String pass);

(本文使用Atom编写)

工厂方法概念

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

类结构图

工厂方法类结构图
工厂方法类结构图

代码示例

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

代码语言:javascript
复制
interface Car {
  String getBrand();
}

interface CarFactory {
  Car makeCar();
}

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

代码语言:javascript
复制
class BigCar implements Car {
   @Override
   public String getBrand() {
       return "Big";
   }
}

class BigCarFactory implements CarFactory {

   @Override
   public Car makeCar() {
       return new BigCar();
   }
}

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

代码语言:javascript
复制
void carTest() {
    // 这里选择要使用的CarFactory
    CarFactory factory = new BigCarFactory();

    // 获取car的代码-无需改变
    Car car = factory.makeCar();

    // 使用Car做操作的代码-无需改变
    car.getBrand();
}

解读?

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-01-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单工厂概念
  • 代码示例
  • 解读
  • 案例
    • jdbc
    • 工厂方法概念
    • 类结构图
    • 代码示例
    • 解读?
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档