重学设计模式-工厂模式

简介:   今天来说一下工厂模式(简单工厂,工厂方法,抽象工厂),工厂模式(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一个复杂的对象时,我们可以选择工厂方法模式。

 

  抽象工厂模式随后更新

目录
相关文章
|
14小时前
|
设计模式 测试技术
【设计模式系列笔记】工厂模式
工厂模式是一种创建型设计模式,其主要目的是将对象的创建过程抽象出来,以便在需要的时候由子类来实现。这种模式提供了一种方法,通过调用一个共同的接口来创建一组相关或依赖的对象,而无需指定其具体的类。
119 4
|
15小时前
|
设计模式 前端开发 测试技术
前端设计模式之【工厂模式】
前端设计模式之【工厂模式】
30 0
|
6月前
|
设计模式
设计模式系列教程(05) - 工厂模式
设计模式系列教程(05) - 工厂模式
26 0
|
8月前
|
设计模式 SQL 安全
重学设计模式-单例模式
  单例模式是指一个类在整个程序运行中只允许存在一个实例,也就是说在JVM里面只存在一个实例,单例模式应用十分广泛,比如说一个公司里面只有一个CEO,一个家庭里面只有一个爸爸(当然,排除那些意外),单例模式主要应用在需要频繁使用创建和使用的一些类上面,因为只存在一个实例,所以节省了内存的开销,所有线程共享同一个实例,试想一下,如果一个类使用十分频繁,没有使用单例模式的情况下,一个线程需要创建一个实例,那么系统中将会出现出现很多多余的实例,对内存的消耗也很大,JVM中容易发生GC,比如数据库连接池,某些不太常用的对象,皆可使用单例模式来做,有助于提高系统的可用性。
41 0
|
11月前
|
设计模式 安全 Java
深入浅出设计模式 - 工厂模式
深入浅出设计模式 - 工厂模式
75 0
深入浅出设计模式 - 工厂模式
|
11月前
|
设计模式 安全 Java
深入浅出设计模式 - 原型模式
深入浅出设计模式 - 原型模式
86 0
深入浅出设计模式 - 原型模式
|
11月前
|
设计模式 XML 安全
深入浅出设计模式 - 建造者模式
深入浅出设计模式 - 建造者模式
71 0
深入浅出设计模式 - 建造者模式
|
设计模式
设计模式学习——工厂模式
说到工厂模式,可能我们脑海中就会蹦出简单工厂、工厂方法以及抽象工厂这几个名词,但是说起他们之间的区别、各自都解决了什么样的问题,那就比较懵了,所以今天我们详细梳理下这三者之间的区别与联系。 一、简单工厂 简单工厂严格来说不能算作一种设计模式,它更像一种编程习惯,用于将具体类的创建从客户端解耦,他的实
184 0
|
设计模式 Java 数据库
设计模式学习总结——工厂模式
在我们平常创建对象的时候,都是通过关键字 new 来实现的,例: Class A = new A() 。 在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式,在任何需要生成复杂对象的地方,都可以使用工厂模式。 工厂模式包括:简单工厂(不在23种设计模式中)、工厂方法和抽象工厂。
设计模式学习总结——工厂模式