创建型-工厂模式

结构多变的工厂模式

  工厂模式也有许多的品种, 这一度让我陷入理解的僵局。明明是这么简单的一个模式,为什么会让我有点恐惧去将这几种工厂模式好好的撸一撸... 今天要好好的做一次尝试。
  工厂模式是一个非常常用的模式,不少的框架中都能看到它的影子: mybatis、spring、dubbo等等,其中spring的BeanFactory和ApplicationContext更是spring的核心。
  先看看目前我了解到的工厂模式的几个品种: 简单工厂、工厂方法、抽象工厂。嗯个人就知道这三种。

简单工厂

  简单工厂确实是很简单,搞一个接口Shape,有实现类Triangle和Circle。嗯可以将Shape当作模具,而实现类就是要胜场的产品。接下来找一个工厂ShapeFactory,让它通过业主给定的图纸来找到对应模具生产产品。

public class ShapeFactory {

    public Shape getShape(String drawing) {
        //按图纸返回对应产品
    }
}

  个人觉得前面的模具、产品啥的都没有太大的区别,就是这个图纸有点说法,常见的图纸: 字符串表示, 枚举表示,classType表示。个人觉得用字符串表示实在是不太稳妥,毕竟现在的接口都讲究一个傻瓜式,字符串传个啥IDE都不会报错,最好还是用后面的2中表示方式:

public class ShapeFactory {

    public Shape getShape(ShapeType type) {
        //按图纸返回对应产品
    }
}

public enum ShapeType {
    CIRCLE,
    TRIANGLE;
}

这时规定了入参, 就避免了未知的输入参数。

使用classType作为入参,可以将工厂变得更加灵活, 直接来个最灵活的体会一下:

public <E> E getObject(Class<E> clazz) {
    return clazz.newInstance();
}

  嗯确实有点灵活过分了,但是这样只适用于创建一个简单对象,这在《大话设计模式》中被称作抽象工厂的改进(反射 + 简单工厂),只不过他用的还是字符串参数,用Class.forName()的方式代替传入Class<?>。个人觉得简单工厂,用枚举的方式比较规范化。
  简单工厂如果要添加产品, 就需要修改对应生产产品的方法,这不符合开闭原则,那么就需要进化一步。

工厂方法

这时工厂也有了上级总包:

public interface IFactory {
    Shape getShape();
}

  特定的工厂只生产特定的产品,这就不需要图纸了,想要什么产品就去什么厂里拿,想想生活中,你想要面粉就去面粉厂是吧。不要和我说去超市,那可不是工厂。这时我想要一个Circle:

public class CircleFactory implements IFactory {
    
    public Shape getShape(){
        return new Circle();
    }
}

这时我们能从这个工厂拿到想要的东西,添加生产产品的时候也能够不修改原有逻辑了。但是每添加一个产品,就多了一个工厂,编码成本提升了。可以好好衡量以下你的工厂是不是一只需要变化然后做选择。

抽象工厂

  简单工厂和工厂方法中可以看出,每个工厂生产的东西比较单一。实际上一个工厂应该会具备生产一系列产品的能力,我们再次对工厂进行改进,我们之前的工厂已经能产生一个图形,现在要在图形上打上特定的logo防止假冒伪劣:

//先添加一个Logo接口
public interface Logo {
    void printLogo();
}
//Circle和Triangle各自有各自的logo
public class CricleLogo implements Logo {
    @Override
    public void printLogo() {
        System.out.println("logo Circle!");
    }
}

public class TriangleLogo implements Logo {
    @Override
    public void printLogo() {
        System.out.println("logo Triangle!");
    }
}

// 在工厂接口中添加制作logo的方法, 抽象工厂(这里个人觉得也可以还是接口)
public abstract class IFactory {
    public abstract Shape getShape();
    public abstract Logo getLogo();
}

//Circle的工厂, Triangle的也是一样的
public class CircleFactory extends IFactory {
    //要实现父类的2个抽象方法
    @Override
    public Shape getShape() {
        return new Cricle();
    }

    @Override
    public Logo getLogo() {
        return new CricleLogo();
    }
}

好了现在的工厂具有了生产一系列产品的能力,可有有选择性的获取shape或logo,升值可以获取2个产品的组合。这个时候可以发现, 如果去掉logo这个产品,其实他就是一个工厂方法模式。也可以这样分类工厂,将Shape分作一个工厂,Logo的制作分为一个工厂,取消一座工厂,也就变成了工厂方法。抽象工厂给一系列的产品提供了一个组合的可能,这一系列就是比较灵活的一个东西了。写法不必拘泥,但是当完成编码的时候回过头来看看,是不是和不使用模式的时候有所改进了,这可能需要时间来检验了。

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

推荐阅读更多精彩内容