前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java设计模式之工厂模式

java设计模式之工厂模式

作者头像
用户4361942
发布2019-05-28 20:36:45
3720
发布2019-05-28 20:36:45
举报
文章被收录于专栏:java程序员思维

1、模式定义

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

2、模式解决的问题

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

3、模式角色

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

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

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

4、代码实现

代码语言:javascript
复制
/** * Created by zengjianlu on 2018/2/23. * @author zengjianlu */public interface Fruit {    /**     * 获取颜色     * @return     */    String getColor();}
代码语言:javascript
复制
/** * Created by zengjianlu on 2018/2/23. * @author zengjianlu */public class Orange implements Fruit{    @Override    public String getColor() {        return "yellow";    }
代码语言:javascript
复制
/** * @author zengjianlu */public class Apple implements Fruit {
    @Override    public String getColor() {        return "red";    }}
代码语言:javascript
复制
/** * 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;        }
    }
}
代码语言:javascript
复制
/** * @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、优缺点分析

优点:

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

缺点:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java程序员思维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档