设计模式笔记第三记——工厂模式

这次不做标题党了,而且也怕自己总结的有问题,所以希望大家看到问题可以及时指正吧,一步一步的写设计模式笔记好了,毕竟设计模式还是太多了。不是单独去学就能完全掌握的,具体还是在实践中体会。接下来进入这次的主题:

简单工厂(静态工厂)

  • 所属:创建型模式
  • 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
  • 何时使用:我们明确地计划不同条件下创建不同实例时。
  • 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
  • 关键代码:创建过程在其子类执行。
  • 优点:
    1、一个调用者想创建一个对象,只要知道其名称就可以了。
    2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

比如说,想生产圆形、矩形、三角形。
假设已经有实体类Circle、Square、Rectangle三个类,里面各有show()方法:
那么main中我们需要这么做:

        Circle oldCircle = new Circle();
        Square oldSquare = new Square();
        Rectangle oldRectangle = new Rectangle();
        oldCircle.show();
        oldSquare.show();
        oldRectangle.show();

当然这调用也没啥问题。
不过这么做,我们需要new三个对象,写程序尽量不要随便使用new。原因后面会说。
所以我们选择创建一个工厂Factory,由他去生产,而我们要做的事情,就是传参~我们传参,他去根据参数的不同,去选择生产的对象。其实我在写策略模式的时候,总有错觉,这些设计模式非常相似,都是通过传各种各样参数去满足我们的需求。说多了。。。我们继续:
创建一个工厂类,他的任务就是接收参数,然后判断需要new出个什么。

/**
 * Created by AceCream on 2017/4/1.
 */
public class ShapeFactory {
    public Shape getShape(String string){
        Shape shape = null;
        switch (string){
            case "Square":
                shape = new Square();
                break;
            case "Circle":
                shape = new Circle();
                break;
            case "Rectangle":
                shape = new Rectangle();
                break;
        }
        return shape;
    }
}

上面的代码就是,我通过获取到字符串,返回Shape类型,Shape是个接口,里面有我们图形类必须有的show()方法,这时候图形类只需要实现Shape这个接口即可~
Ps:说一下,尽量不要瞎用if...else,因为每一次选择你都需要判断很多条件。
例如:

public class Circle implements Shape{
    @Override
    public void show() {
        System.out.println("我是圆形...");
    }
}

随后我们看一下实现类:

/**
 * Created by AceCream on 2017/4/1.
 */
public class ShapeDemo {
    public static void main(String[] args) {

        ShapeFactory shapeFactory = new ShapeFactory();

        Shape circle = shapeFactory.getShape("Circle");
        circle.show();
        Shape rectangle = shapeFactory.getShape("Rectangle");
        rectangle.show();
        Shape square = shapeFactory.getShape("Square");
        square.show();
    }
}

看!我只new了一个工厂,当我需要Circle的时候,我就告诉工厂:“你去查查看,生产个Circle给我”。他就去找,然后new出一个Circle返回给我。这里很好的利用了面向对象的封装和多态!这就是简单工厂咯~

至于抽象工厂,我给大家贴个图:

抽象工厂模式涉及的类

简单解释一下:Red、Green、Blue类是颜色,由ColorFactory生产,剩下的那部分还是和上面一样由ShapeFactory生产。
多了个啥?

/**
 * Created by AceCream on 2017/4/1.
 * 抽象工厂
 * 为 Color 和 Shape 对象创建抽象类来获取工厂。
 */
public abstract class AbstractFactory {
    abstract Color getColor(String color);
    abstract Shape getShape(String shape);
}

对~就是上面这玩意,用了就是抽象工厂了。
其实感觉抽象工厂模式挺臃肿的,而且个人感觉啊,不是很喜欢它。而事实也是:基本上很多人一辈子都用不上它,所以我给自己的标准是——重要的东西必须弄个明白!但是脑容量有限,剩下的知道大概就好了,用时候就去查也能马上捡起来。

后面的话(个人的阶段学习体会,可以跳过)

所以!我会困惑为什么需要工厂模式?
是的,如果是我们日常写代码,使用设计模式可能反而会变得复杂,但是如果工程项目大了起来,设计模式就显得尤为重要了!这里转一句知乎大神的一句话:

在实际的项目中,在你通往架构师的道路上,你要培养出一种感觉:要new一个实体对象是件很谨慎的事情(不是指值对象),不要随便new。最好不要自己new,让别人去new,传给你去调用。这样new错了也是别人的事,换而言之你的模块是好质量的,禁得起推敲的。那么都不愿意去new,谁去new?让专门的一个工厂去new。请注意:这仅仅是解决new的方式之一,此外还要反射啊等等。那你必须要等到真正接触大型项目才能有体味的。
作者:余叶
链接:https://www.zhihu.com/question/24843188/answer/49197026
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我发现当项目阅历不足够的时候去学习设计模式是一件很费力的事情,因为没接触过大的项目,就没有遇到过特定的需求,一直通过自己研究的小的东西,然后跳过实战去看原理、去奢求,不足以让我们去宏观的看问题。
所以我这几天给自己的警醒是:
实践很重要,在实践中去思考更重要。跳过实践去研究原理,研究明白一时,到了该用的时候不知道咋用~岂不是很悲哀?

此文参考:
菜鸟教程——工厂模式

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

推荐阅读更多精彩内容