专栏首页java程序员思维java设计模式之工厂模式

java设计模式之工厂模式

1、模式定义

工厂模式(Factory Pattern)提供了一种创建对象的方式,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,属于创建型模式。

2、模式解决的问题

提供一个统一的创建对象的方法,客户端不用关心对象是怎么创建的,工厂可以根据不同的情况,可以每一次都返回同一个对象(单例),也可以每次都返回一个新的对象(多例),单例的情况居多,比如获取连接池对象。

3、模式角色

工厂(Factory):工厂主要作用,完成具体产品的创建。

抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

4、代码实现

/** * Created by zengjianlu on 2018/2/23. * @author zengjianlu */public interface Fruit {    /**     * 获取颜色     * @return     */    String getColor();}
/** * Created by zengjianlu on 2018/2/23. * @author zengjianlu */public class Orange implements Fruit{    @Override    public String getColor() {        return "yellow";    }
/** * @author zengjianlu */public class Apple implements Fruit {
    @Override    public String getColor() {        return "red";    }}
/** * Created by zengjianlu on 2018/2/23. * * 缺点违反开闭原则,增加新的水果需要修改静态工厂方法 * * @author zengjianlu */public class FruitFactory {
    private final static String APPLE = "apple";
    private final static String ORANGE = "orange";
    private final static Fruit APPLE_FRUIT = new Apple();
    private final static Fruit ORANGE_FRUIT = new Orange();
    public static Fruit getFruitInstance(String fruitName){        if(APPLE.equals(fruitName)){            return APPLE_FRUIT;        }else if (ORANGE.equals(fruitName)){            return ORANGE_FRUIT;        }else {            return APPLE_FRUIT;        }
    }
}
/** * @author zengjianlu * @date 2019/5/19 */public class Test {    public static void main(String[] args) {        Fruit orange = FruitFactory.getFruitInstance("orange");        System.out.println("orange color :" + orange.getColor());        Fruit apple = FruitFactory.getFruitInstance("apple");        System.out.println("apple color :" + apple.getColor());    }}

5、运行结果

6、优缺点分析

优点:

一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:

每次增加一种产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度。违背了开闭原则,如果有新的产品,需要修改工厂类。

本文分享自微信公众号 - java程序员思维(java_python_go),作者:曾建路

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Head First 设计模式之装饰器模式,因为参与,所以认同

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包...

    用户4361942
  • java设计模式之备忘录模式,世上真的有“后悔药”,带你穿越回过去

    备忘录模式(Memento Pattern)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢...

    用户4361942
  • java设计模式之责任链模式,一个也不能少,每个人都是主角

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解...

    用户4361942
  • 谷歌大脑研究员玩转汉字RNN:神经网络生成新华字典

    【新智元导读】你永远不知道汉字的潜力。谷歌大脑东京分部的研究员hardmaru,用神经网络根据笔画生成汉字,新造了一系列“假汉字”。你别说,有些看上去还真像那么...

    新智元
  • pytest封神之路第六步 断言技巧

    pytest的断言把Python语言简洁的优点发挥的淋漓尽致,因为它用的就是Python的标准断言assert。

    dongfanger
  • R语言RStan贝叶斯示例:重复试验模型和种群竞争模型Lotka Volterra

    Stan是一种用于指定统计模型的概率编程语言。Stan通过马尔可夫链蒙特卡罗方法(例如No-U-Turn采样器,一种汉密尔顿蒙特卡洛采样的自适应形式)为连续变量...

    拓端
  • 设计模式-流畅接口

    感觉上面起来都有些啰嗦,看了下QString文档,QString的append接口调用后返回自己的引用,那么就可以这样写。

    Qt君
  • 【crud】全栈-在线备忘录-node-express-MongoDB

    这个VueJs的demo,这是一个在线的备忘录,算是全栈的一个应用吧,第一版的很简陋的demo贴上来,以后再美化UI,先把crud流程跑通再说, ? <!-- ...

    web前端教室
  • 闲话权限系统的设计

    一、权限的本质 权限管理,首先要理清权限的本质:权限就是对受保护资源的有限许可访问。 理解了权限的本质,就好谈权限的管理了。 权限就是对受保护资源的有限许可访问...

    用户1177503
  • Android 运行时权限及APP适配

    Android 6.0起,Android加强了权限管理,引入运行时权限概念。对于:

    宋凯伦

扫码关注云+社区

领取腾讯云代金券