1. 聚能聊>
  2. 话题详情

聊聊设计模式,一个生产“对象”的地方,你有“对象”了吗?

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

除了使用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、说说你对工厂方法模式存在的疑问,或在使用工厂方法模式时遇到的那些坑。

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    阿里云代金券 x 5

  • 奖品二

    手机话费 x 1

  • 奖品三

    多功能工具箱 x 1

45个回答

0

1706021792887332 复制链接去分享

第一天注册阿里云,想感受一下阿里云到底有多神奇

微wx笑 回复

欢迎欢迎!

评论
0

1091321813006573 复制链接去分享

生产的对象

微wx笑 回复

你有“对象”了吗?

评论
0

1706121808975193 复制链接去分享

我也想学习

微wx笑 回复

加油

评论
0

1313421793804444 复制链接去分享

不懂这个平台,

微wx笑 回复

没关系,来的多了就懂了。

评论
0

1140806655336378 复制链接去分享

这里有没学习用阿里云的地方或者课程。就光知道名字,不知道怎么用😂😂😂

0

1232022007089711 复制链接去分享

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

0

1849121993302135 复制链接去分享

啥也不懂

0

aoteman675 复制链接去分享

坐沙发,等大神们上代码学习

0

1876821501535690 复制链接去分享

你好

0

1298718398878498 复制链接去分享

01264210模块,黑白熵序包。

0

兵锋轮回 复制链接去分享

进来听大神们

0

1950719817132816 复制链接去分享

赞我

0

1787521639564901 复制链接去分享

w

0

侯勇 复制链接去分享

吧发布

0

平涛 复制链接去分享

工厂类常用

0

1616421900114324 复制链接去分享

新人进站;有点不习惯😊

0

1616421900114324 复制链接去分享

新人进站;有点不习惯😊

0

jseteary 复制链接去分享

厉害了我的云

0

jseteary 复制链接去分享

什么是设计模式

0

shenyu8454 复制链接去分享

家里PC台式机应为自己设置的端口出来点问题,应该如何更改?现在用不了电脑了,不开心。。。。

3