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

简单工厂概念

又叫做静态工厂方法(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();
}

解读?

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏做全栈攻城狮

电脑小白学习软件开发(八)-复杂数据类型介绍使用,枚举,数组

枚举表示的是:限定只能包括列出来的值。我们这里以星期来举例子。顾名思义,星期只能包括星期一到星期日。用代码来表示下。

10940
来自专栏chafezhou

Python 工匠:编写条件分支代码的技巧

16740
来自专栏Crossin的编程教室

【Python 第19课】 函数

数学上的函数,是指给定一个输入,就会有唯一输出的一种对应关系。编程语言里的函数跟这个意思差不多,但也有不同。函数就是一块语句,这块语句有个名字,你可以在需要时反...

31270
来自专栏Flutter入门到实战

封装工厂类创建BottomNavigationBar的addItem

●  工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

11220
来自专栏王亚昌的专栏

C++多线程编程学习二 [类中封装互斥量的设计]

      之前我也提到过,如果一个类的数据成员中在多线程环境中可能会被竞争使用时,一定要在类中解决这个问题,而不是在代码编写过程中在每次使用时去申请或释放,这...

9510
来自专栏互联网开发者交流社区

我个人对OOP的理解

10930
来自专栏工科狗和生物喵

【计算机本科补全计划】C++牛客网试题习题解析

正文之前 一大早醒来,外面淅淅沥沥的雨绵绵的下着,床铺真的舒服,但是我也不能就在床上刷微博看小说吧,所以想起了昨晚下载的牛客网的APP,赶紧掏出我的大宝贝---...

40670
来自专栏带你撸出一手好代码

从PHP代码的细节说起

因为一个BUG, 我在一个摇摇欲坠,几乎碰一下就会散架的项目中某一个角落中发现下面这样一段代码 ? 这段程序与那个BUG有密切的关系。 我来回反复的捉摸这段代码...

46970
来自专栏landv

C语言介绍

59520
来自专栏java一日一条

关于 Java 对象序列化您不知道的 5 件事

数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处。

7710

扫码关注云+社区

领取腾讯云代金券