【聚能聊话题】聊聊设计模式,一个生产“对象”的地方,你有“对象”了吗?-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

【聚能聊话题】聊聊设计模式,一个生产“对象”的地方,你有“对象”了吗?

简介: 准备好开始烘烤某些松耦合的OO设计。除了使用new操作符之外,还有更多制造对象 的方法。实例化这个活动不应该总是公开地进行,初始化经常造成“耦合”问题。你是否想了解工厂模式如何从复杂的依赖中帮你脱困?

前面我们聊了:
什么是设计模式?你知道多少?
你必须知道的六大设计原则
第一个设计模式,我是皇帝我独苗
今天我们来聊聊第二个设计模式,工厂方法模式。

除了使用new操作符之外,还有更多制造对象 的方法。实例化这个活动不应该总是公开地进行,初始化经常造成“耦合”问题。你是否想了解工厂模式如何从复杂的依赖中帮你脱困?
image
工厂模式属于创建型设计模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。工厂模式分为:工厂方法模式和抽象工厂模式,今天的主角是工厂方法模式。

描述
定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

使用场景
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

优点
创建对象的接口,让子类决定具体实例化的对象,把简单的内部逻辑判断移到了客户端。扩展性高,想要增加一个产品,只要扩展一个工厂类就可以。

示例

public interface ShapeFactory {
    
    public Shape getShape();
    
}

public class CircleFactory implements ShapeFactory {  
  
    @Override  
    public Shape getShape() {  
        return new Circle();  
    }  
  
}  

public class RectangleFactory implements ShapeFactory {

    @Override
    public Shape getShape() {
        return new Rectangle();
    }

}

public class SquareFactory implements ShapeFactory {  
  
    @Override  
    public Shape getShape() {  
        return new Square();  
    }  
  
}  

public class ShapeFactory {  
      
    public Shape getShape(String type) {  
        if ("circle".equals(type)) {  
            return new Circle();  
        } else if ("rectangle".equals(type)) {  
            return new Rectangle();  
        } else if ("square".equals(type)) {  
            return new Square();  
        } else {  
            return null;  
        }  
    }  
      
}  

public class FactoryMethodDemo {  
      
    public static void main(String[] args) {  
        ShapeFactory circleFactory = new CircleFactory();  
        circleFactory.getShape().draw();  
        ShapeFactory rectangleFactory = new RectangleFactory();  
        rectangleFactory.getShape().draw();  
        ShapeFactory squareFactory = new SquareFactory();  
        squareFactory.getShape().draw();  
    }  
  
}  

最佳实践
工厂方法模式在项目中使用得非常频繁,以至于很多代码中都包含工厂方法模式。该模式几乎尽人皆知,但不是每个人都能用得好。熟能生巧,熟练掌握该模式,多思考工厂方法如何应用,而且工厂方法模式还可以与其他模式混合使用(例如模板方法模式、单例模式、原型模式等),变化出无穷的优秀设计,这也正是软件设计和开发的乐趣所在。

那么问题来了:
1、它还可以应用于哪些应用场景?

2、你做过的项目中采用工厂方法模式了吗?是否与其它模式混合使用?

3、你是否知道工厂方法模式的其它实现方式?(上代码)

4、说说你对工厂方法模式存在的疑问,或在使用工厂方法模式时遇到的那些坑。

点击链接去参与话题,认真回复就可能获得以下奖品哦!
image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章