前面我们聊了:
什么是设计模式?你知道多少?
你必须知道的六大设计原则
第一个设计模式,我是皇帝我独苗
今天我们来聊聊第二个设计模式,工厂方法模式。
除了使用new操作符之外,还有更多制造对象 的方法。实例化这个活动不应该总是公开地进行,初始化经常造成“耦合”问题。你是否想了解工厂模式如何从复杂的依赖中帮你脱困?
工厂模式属于创建型设计模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。工厂模式分为:工厂方法模式和抽象工厂模式,今天的主角是工厂方法模式。
描述
定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。
使用场景
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、说说你对工厂方法模式存在的疑问,或在使用工厂方法模式时遇到的那些坑。
点击链接去参与话题,认真回复就可能获得以下奖品哦!