设计模式之工厂模式

    写在第一句的话:设计模式虽好,可不要贪杯哦,不要为了套设计模式而写设计模式,别把简单的问题复杂化。

    刚接触设计模式的时候,很疑惑,设计模式有什么用,又不能帮我写代码,但是时间长了,才知道,设计模式虽然不能帮助写代码,却有利于项目重构和扩展。

是什么?

    设计模式就是曾经写过代码的一批大佬们为了更好更方便的扩展和重构项目,利于发展的一种经验总结,所谓前人种树,后人乘凉,大佬们铺好了路,就看你走不走这条路。

原则是什么?

    所有的设计模式都遵循着几大原则,而原则都是围绕着如何快速扩展你的业务(代码),降低耦合度,减少工作任务开展的,用官方的话来讲,6大准则:

    单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

    里氏代换原则(Liskov Substitution Principle):只要父类出现的地方子类就一定可以出现,而且替换为子类也不会出现任何异常或错误,使用者不需要知道是父类还是子类。但是返回来就不行了,有子类出现的地方,不一定能使用父类。

     依赖倒置原则(Dependence Inversion Principle):高层模块不应该依赖低层模块,两者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。

    接口隔离原则(Interface Segregation Principle):客户端不应该依赖它不需要的接口,类之间的依赖关系应该建立在最小的接口上。

    迪米特法则(Demeter Principle):一个对象应该对其他对象有最少的了解

    开闭原则(Open Close Principle):一个软件实体如类,模块和函数应该对扩展开放,对修改关闭,开闭原则也是其他五个原则的基石

    你说6大原则要背吗?我反正天生愚钝,背下来就忘,你说背下来有用吗,有,面试装逼绝对够用,那我自己背不下来,咋办,我是这样理解的,我既然背不下来,那我就用心去搞懂他。说白了6大原则都围绕高内聚,低耦合的思维,理解着种思路,再去理解看一遍。

有哪些设计模式?


    看图例这么多设计模式,刚接触的人基本都是吓死的,但是总结着看,设计模式分三类,抽象着看就是:

    创建型模式-->对象怎么来

    结构型模式-->对象和谁有关

    行型模式-->对象与对象在干嘛

    对设计模式有个大概的概念了解了,下面我们就聊一下具体的设计模式:工厂模式。

工厂模式是什么?

    你看名字,工厂,主要是生产产品的,客户下单给工厂,工厂进行生产,而生产过程对客户来说是封闭的,不可见的。工厂模式就起到这种作用,你平时需要new来创建对象的过程,交给工厂类来实现。

    工厂模式细分优有三种:简单工厂模式,工厂方法模式,抽象工厂模式。 下面我给大家先讲讲简单工厂模式。

    在很久以前,有这么一家工厂,大家都亲切的称呼为浙江温州皮革厂,这家皮革工厂的老板黄先生,研究专门生产各种类型产品的包,男士包,女士包,钱包。

    以前呢,老板总是通过大音响在街头宣传自己的产品,然后别人打电话下单,出了新品别人也不知道,后来老板想起在上海的小叔子是写代码的,就让他帮忙写个商城来帮助自己做买卖。


    小叔子拿到需求后,看了一眼,这不就是自己刚学习的工厂模式么,于是小叔子画下了UML图。


    简单工厂模式:又称静态工厂方法模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    用人话说就是,我给工厂一个包包参数,工厂一看我有这个包,可以生产,那么我给返回这个包的实例对象。如果没有呢?可以返回报错或者空的,但是就是无法去生产自己没有的这个包。

    从UML来看,简单工厂模式

    工厂类(Factory)角色:担任这个角色的是简单工厂模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。


    抽象产品(AbstractProduct)角色:担任这个角色的类是由简单工厂模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类实现。


    具体产品(Product)角色:简单工厂模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。


    那么简单工厂模式解决什么问题呢,请看下面例子:

    没有运用设计模式的时候,我需要拿到一个包的实例要怎么做。

public class   MenBags {

    private double price;

    private double size;

    private String color;

    public MenBags(){

        System.out.println("Create a MenBags");

    }

    public void product(){

         System.out.println("MenBags start product");

     }

}


public class WomenBags{

    private double price;

    private double size;

    private String color;

    public WomenBags(){

        System.out.println("Create a WomenBags");

    }

    public void product(){

         System.out.println("WomenBags start product");

     }

}

我要开始进行生产了:

public class Main {

    public static void main(String[] args) {

    //今天想做男士包 

    MenBags menBags = new MenBags();

     menBags.product();  

    }

}

public class Main {

    public static void main(String[] args) {

    //今天想做女士包 

    WomenBags womenBags = new WomenBags();

     womenBags.product();  

    }

}

这样做有什么问题没有,有的,代码结构乱,不容易维护,不管是男士包或者女式包都有相同的属性,那么为什么不进行抽象出一个公共的父类呢。

public abstract class Bag{

    abstract void product();

}


public class MenBags extends Bag{

    public MenBags(){

    System.out.println("Create a MenBags");

    }

    @Override

    public void product(){

         System.out.println("MenBags start product");

     }

}


public class WomenBags extends Bag{

    public WomenBags(){

        System.out.println("Create a WomenBags");

    }

    @Override

    public void product(){

     System.out.println("WomenBags start product");

         }

}

然后呢,因为是小工厂作坊式的,那么我再加个工厂来管理我的产品:

public class BagFactory() throws Exception{

    public statis Bag getBag(String bagType){

        if(“MenBags”.eques(bagType)){

            return  new  MenBags();

        }else if(“WomenBags ”.eques(bagType)){

            return  new  WomenBags();

        }else{

            throw new Exception();

                }

        }

}

好了,工厂建好了,我们只需要让客户知道他要什么产品就行了。假如黄老板的亲戚要个男包,好了,这个时候怎么操作呢。

public class Main {

        public static void main(String[] args) {

        //今天想做男士包 

        private final String menBags = “MenBags”;

        private final String womenBags= “WomenBags”;

        Bags bags = BagFactory.getBag(menBags);

         bags.product();  

        }

}

好了,简单工厂模式讲完了,是不是清晰了很多,这样做有什么好处呢?


优点:这样模块清晰化,每个部分都各司其职,分工明确,代码就实现最渐层意义上的“可维护”

缺点:

1。使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度

2。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。所以说从工厂的角度来说简单工厂模式是不符合“开-闭”原则的。

3。简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

简单讲就是简单工厂模式不符合设计原则,但是却符合简单的小作坊小工厂模式,也就是产品少,创建对象少,逻辑不复杂。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 概述 工厂模式属于创建型模式,需要生成的对象叫产品,生产对象的地方叫工厂。实现了调用者和创建者的分离。 工厂模式的...
    叫我小码哥阅读 205评论 0 2
  • 客户需求 程序设计 1、PizzaStore是用来给客户下订单买pizza的,所以每个PizzaStore都会有一...
    BlainPeng阅读 553评论 0 2
  • 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些...
    聂叼叼阅读 3,998评论 2 16
  • 工厂模式是最常用的一类创建型设计模式,之前一直以为工厂模式只是23中设计模式中的一种,重新了解才知道这个模式还要细...
    晨鸣code阅读 1,274评论 0 6
  • 舞狮子,接龙灯,赏花灯 猜灯谜…… 让我想想,这是哪一年的事 一碗汤圆 吃着吃着 惆怅就滚了出来 生命中 这是第几...
    云儿云儿阅读 233评论 0 4