重学设计模式-工厂模式

简介:   今天来说一下工厂模式(简单工厂,工厂方法,抽象工厂),工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

个人感悟


  写了几年的代码后,开始意识到自己写的代码越来越不堪入目,看了以前的代码后,各种冗余,十分臃肿和繁琐,逐渐意识到设计模式的重要性,大学期间教我Java EE的老师一直给我们强调设计模式的重要性,切勿盲目的写代码,但是就是不听,心想,老子不用设计模式,一样能跑起来,现在回想起来,真是年轻,不过在当时那个背景下,做学校的项目或者外面的一些小项目,都是比较传统的项目,根本谈不上并发,扩展,架构等问题,所以根本谈不上用设计模式,后来逐渐接触了一些项目后,思维开始发生变化,特别是在自己开发了一个功能以后,后期需要改的时候,回去看,几百行凌乱的代码摆在眼前,各种循环,各种if else,让人十分的痛苦,不过依然还是要咬牙去看,去改,因为是自己造成的。


  所以,设计模式的重要性我想不用强调过多了!

  

  今天来说一下工厂模式(简单工厂,工厂方法,抽象工厂),工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。


  一.简单工厂


    我们以创建商品为例,在电商网站中,创建商品是一个重要的模块,商品是多样性的,我们应该可以创建不同类型的商品,我们先看一下如果没有使用工厂模式,我们在代码里面是如何创建商品的;



    上图使用if else来判断商品类型,然后进行创建,也可以使用switch case来做判断,但是不难看出,商品少的时候问题倒是不大,但是商品很多的时候,就要写很多判断语句,一方面代码十分不美观,另一方面则很难维护,如果某个商品发生了变更,那么就要来判断条件里面改,显然不合理,下面我们使用简单工厂来对代码进行改造。


  1.创建一个商品接口。



  2.创建商品实现类CommodittyA和CommodittyB,用来对商品A和B做具体实现




  3.创建商品工厂,用于获取商品实例。



  上面是获取商品实例的工厂,只需要传入相应的商品枚举,就能够返回对应的商品实例,但是我们发现一个问题,如果使用if else来判断商品类型,没增加一个商品,就需要加一个判断条件,显然不符合开闭原则,那怎么办呢,很简单,我们可以使用反射机制来完成这个工作,继续对代码进行改造。



  使用反射机制后,可以在运行时动态的获取某个类,这就比较灵活了,我们客户端只需要传入类就行。



  使用简单工厂我们可以让我们很方便的创建我们的产品,但是我们不难看出,一个工厂负责所有产品的生产,如果产品少其实还行,但是如果商品特别多,那么整个工厂就会变得十分庞大,臃肿,我们应该在工厂这个维度进行细分,一个工厂过于搭,我们分为两个,A商品专门让A工厂生产,B商品由B工厂生产,让它们各司其职,分工明确。


  由此我们引入了工厂方法;


  二.工厂方法


  工厂方法分工明确,不再让所有工作都放在同一个工厂里面做,而是每一个商品对应一个工厂,这样划分后,工厂就不会变得臃肿,当需要增加商品时,增加对应的工厂就行。


  1.首先创建一个抽象工厂类,任何工厂都必须继承它,



  2.创建具体实现工厂类,继承抽象工厂,用于实现具体商品



  3.抽象产品类,它定义了生产产品的方法,具体实现产品的类必须继承它



  4.客户端调用



  由上面步骤我们可知,我们定义了一个抽象工厂类,一个抽象产品类,然后具体的工厂继承抽象工厂,具体产品继承抽象产品类,当新增一个商品时,增加相应的具体工厂类和具体产品类就行了,而不用去代码里面新增,符合开闭原则。


  关系图如下



  至此工厂方法模式就完了,我们可以得知工厂方法模式的可以使分工更加的明确,耦合性很小,容易扩展,当我们在系统中需要new一个复杂的对象时,我们可以选择工厂方法模式。

 

  抽象工厂模式随后更新

目录
相关文章
|
7月前
|
设计模式 测试技术
【设计模式系列笔记】工厂模式
工厂模式是一种创建型设计模式,其主要目的是将对象的创建过程抽象出来,以便在需要的时候由子类来实现。这种模式提供了一种方法,通过调用一个共同的接口来创建一组相关或依赖的对象,而无需指定其具体的类。
167 4
|
设计模式 Java
【设计模式】Java设计模式 - 装饰者模式
装饰者模式是一种结构型模型,是动态的给对象增加职责,对于新增功能来说要比通过子类方式更加的灵活。他允许对一个对象进行添加新的功能,但不能改变结构。
127 1
【设计模式】Java设计模式 - 装饰者模式
|
设计模式 Rust Java
二十三种设计模式:工厂模式
在上面的示例中,我们定义了一个抽象的产品类 Product,它包含一个抽象的方法 use(),用于表示产品的使用方法。具体的产品类 ProductA 和 ProductB 继承自 Product,并实现了 use() 方法。
84 0
|
设计模式 安全 Java
JAVA设计模式第二讲:创建型设计模式(上)
JAVA设计模式第二讲:创建型设计模式(上)
|
设计模式 Java 数据格式
JAVA设计模式第二讲:创建型设计模式(下)
JAVA设计模式第二讲:创建型设计模式(下)
|
设计模式 算法 Java
JAVA设计模式第四讲:行为型设计模式
JAVA设计模式第四讲:行为型设计模式
136 0
|
设计模式 SQL 安全
重学设计模式-单例模式
  单例模式是指一个类在整个程序运行中只允许存在一个实例,也就是说在JVM里面只存在一个实例,单例模式应用十分广泛,比如说一个公司里面只有一个CEO,一个家庭里面只有一个爸爸(当然,排除那些意外),单例模式主要应用在需要频繁使用创建和使用的一些类上面,因为只存在一个实例,所以节省了内存的开销,所有线程共享同一个实例,试想一下,如果一个类使用十分频繁,没有使用单例模式的情况下,一个线程需要创建一个实例,那么系统中将会出现出现很多多余的实例,对内存的消耗也很大,JVM中容易发生GC,比如数据库连接池,某些不太常用的对象,皆可使用单例模式来做,有助于提高系统的可用性。
69 0
|
设计模式 Java uml
【设计模式】Java设计模式 - 模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
109 0
【设计模式】Java设计模式 - 模板模式
|
设计模式 Java 数据库连接
【设计模式】Java设计模式 - 原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
【设计模式】Java设计模式 - 原型模式
|
设计模式 Java uml
【设计模式】Java设计模式 -工厂模式
在大多情况下,我们都是用new去实例化对象。但是,有时候有的对象的类别有很多种,又存在着共性,就好比如汽车,有奔驰,红旗,宝马等品牌,如果是一个一个去创建类,那就需要创建很多,因此就需要用到工厂模式。
126 0
【设计模式】Java设计模式 -工厂模式