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

简介: 准备好开始烘烤某些松耦合的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

目录
相关文章
|
4月前
|
设计模式
二十三种设计模式全面解析-解密组合模式(Composite Pattern):构建统一而强大的对象结构
二十三种设计模式全面解析-解密组合模式(Composite Pattern):构建统一而强大的对象结构
|
4月前
|
设计模式 Java
Java设计模式【二十二】:空对象模式
Java设计模式【二十二】:空对象模式
26 0
|
4月前
|
设计模式 存储 安全
二十三种设计模式全面解析-享元模式(Flyweight Pattern)详解:构建高效共享的对象结构
二十三种设计模式全面解析-享元模式(Flyweight Pattern)详解:构建高效共享的对象结构
|
4月前
|
设计模式 存储
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
|
4月前
|
设计模式
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
|
4月前
|
设计模式
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
|
20天前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
108 1
|
3月前
|
设计模式 uml
设计模式-适配器模式(对象适配器)
设计模式-适配器模式(对象适配器)
19 0
|
4月前
|
设计模式 存储
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
|
4月前
|
设计模式
二十三种设计模式全面解析-深入探讨状态模式的高级应用技术:释放对象行为的无限可能
二十三种设计模式全面解析-深入探讨状态模式的高级应用技术:释放对象行为的无限可能