zoukankan      html  css  js  c++  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一个复杂的对象时,我们可以选择工厂方法模式。

       抽象工厂模式随后更新

       

    生命不止,折腾不息
  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/steakliu/p/14793395.html
Copyright © 2011-2022 走看看