文档章节

设计模式 - 工厂模式

KuangCaibao
 KuangCaibao
发布于 2015/04/17 16:11
字数 830
阅读 15
收藏 0

先看看这个模式的发展流程,3个角色:Customer(消费者),Product(产品)和Factory(工厂)。

传统的类创建过程

消费者需要什么产品,自己去创建它。

public class Customer {
  public Product CreateProduct() {
    return new Product(); 
  }
}

这个方式的缺点就是,代码都在一起,扩展性差。当有多个产品的时候,Customer必须实现每一个产品的Create。严重违反了开闭原则。


工厂模式一: 简单工厂模式

将产品的创建放到工厂中去解决。

/**
 * 工厂类
 */
class Factory {

  // 可以看到这里的类型返回,还是有点问题的
  // 因为不同产品返回的类型是不一样的
  // 这里有一种解决方案就是,将所有的产品抽象出一个抽象类出来,然后让各个产品类去继承这个产品抽象类,如下
  public static Product CreateProduct(String type) {
    // 根据 type 的类型返回对应的产品类
    if( type == "type1") {
      return (Product) new Product1();
    } else if ( type == "type2") {
      return (Product) new Product2();
    }
  }
}

/**
 * 产品类
 */
abstract class Product {}
class Product1 extends Product {}
class Product2 extends Product {}

/**
 * 客户类
 */
 public class Customer {
   public static Product GetProduct(String type) {
     return Factory::CreateProduct(type);
   }
   
   public static void main(String[] args) {
     Product1 pro1 = (Product1) GetProduct("type1");
   }
 }

上面的模式看着比较不错了,下面我们从这3个类来分析下这种模式的开闭性。评价场景:当客户需要新的产品类型的时候,如Product3.

对于Customer,仅仅只需要在 GetProduct 方法中传入Product3的type值就行,如 type3 , 对于 Customer 是很符合开闭原则的

对于Factory, 当增加Product3的创建的时候,我们就需要修改 CreateProduct 中的逻辑了,对 Factory 来说 开闭性 不是很好

对于Product,肯定是要添加新的Product的

class Product3 extends Product {}

可以看到对于 Product,Product1 和 Product2 来说,是没有影响的,符合开闭性。

可见到这里,我们需要将Factory方法再抽象下,以符合开闭性原则。


工厂模式二 : 工厂方法

将 Factory 中的静态方法 CreateProduct ,抽象成一个抽象的方法,然后在各个不同的Product类中去实现。这样 Factory 就成了接口了。

interface Factory {
  public abstract Prodcut CreateProduct();
}

class Product1Impl implements Factory {
  public Product CreateProduct() {
     return (Product) new Product1();
  }
}

可以看到,如果这样设计的话,那么Product的类型的选择就交给了Customer了

public class Customer {
  public static Product GetProduct(String type) {
    Product pro = null;
    if(type == "type1") {
      Product1Impl pro1Impl = new Product1Impl();
      pro = pro1Impl.CreateProduct();
    }
    
    return pro;
  }
  ...
}

将Facotry中的方法,通过每个特定产品的实现类去做。这个时候,如果我们增加一个新的产品。我们需要增加如下的内容:

// 新增加产品类型的实现类
class Product3Impl implements Factory {
  public Product CreateProduct() {
    return (Product) new Product3();
  }
}

// 新增加的产品类型类
class Product3 extends Product {}

// 在客户类中需增加的内容
public class Customer {
  public static Product GetProduct(String type) {
    ...
    else if( type == "type3") {
      Product3Impl pro3Impl = new Product3Impl();
      pro = pro3Impl.CreateProduct();
    }
  }
}

看到对于客户类又有了改动。这个时候其实可以使用反射来做。怎么做?

首先每个类都有 .class 属性,例如上面的代码在包 com 中,则

System.out.println(Product1.class);

// output
class com.Product1


工厂模式三:工厂抽象


未完

对于工厂模式的理解有点问题,等待更新。如果有比较好相关blog,求推荐,看看。

© 著作权归作者所有

上一篇: Java - 反射
下一篇: Java - 接口
KuangCaibao
粉丝 2
博文 21
码字总数 10699
作品 0
武汉
程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.5K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
185
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JDBC 连接数据库的流程?

加载 JDBC 驱动程序 利用 url,user,password 创建数据库连接 创建 statement 对象执行 sql 语句 返回查询结果 resultset 关闭连接,释放 JDBC 资源。关闭的顺序与开启的顺序相反:resultset...

happywe
29分钟前
2
0
如何让视频加速播放

当下的视频工作者越来越多,很多人在闲暇时间也会制作一些好玩有趣的短视频上传一些社交媒体。下面分享一个让视频加速播放的软件以及制作方法,学会这个方法后,可以制作一些有趣的加速视频啦...

白米稀饭2019
36分钟前
2
0
生成带图片的二维码

1,pom.xml 中 <!-- ZXing --><dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version></dependency><dependency......

简小姐
45分钟前
3
0
可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! **导读:**InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Ja...

阿里巴巴云原生
59分钟前
3
0
Mybatis 配置详解

完整配置 mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.......

xiaolyuh
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部