三种工厂模式的区别和特点
典型回答 工厂模式的主要功能就是帮助我们实例化对象的。之所以名字中包含工厂模式四个字,是因为对象的实例化过程是通过工厂实现的,是用工厂代替new操作的。 这样做的好处是封装了对象的实例化细节,尤其是对于实例化较复杂或者对象的生命周期应该集中管理的情况。会给你系统带来更大的可扩展性和尽量少的修改量。 **工厂模式有三种,分别是简单工厂模式、工厂方法模式、抽象工厂模式。**三种模式从前到后越来越抽象,也更具有一般性。 **简单工厂 :一个工厂创建所有具体产品。**对于增加新的产品,主要是新增产品,就要修改工厂类。符合单一职责原则。不符合开放-封闭原则 优点: 1、屏蔽产品的具体实现,调用者只关心产品的接口。 2、实现简单 缺点: 1、增加产品,需要修改工厂类,不符合开放-封闭原则 2、工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则 **工厂方法 :一个工厂方法只创建一个具体产品。**支持增加任意产品,新增产品时不需要更改已有的工厂,需要增加该产品对应的工厂。符合单一职责原则、符合开放-封闭原则。但是引入了复杂性 优点: 1、继承了简单工厂模式的优点 2、符合开放-封闭原则 缺点: 1、增加产品,需要增加新的工厂类,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。 抽象工厂 :一个工厂方法只创建一类具体产品。增加新产品时,需要修改工厂,增加产品族时,需要增加工厂。符合单一职责原则,部分符合开放-封闭原则,降低了复杂性 优点: 1、隔离了具体类的生成,使得客户并不需要知道什么被创建 2、每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便; 缺点 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。 扩展知识 简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 在介绍简单工厂模式之前,我们尝试解决以下问题: 现在我们要使用面向对象的形式定义计算器,为了实现各算法之间的解耦。主要的用到的类如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 // 计算类的基类 public abstract class Operation { private double value1 = 0; private double value2 = 0; public double getValue1() { return value1; } public void setValue1(double value1) { this.value1 = value1; } public double getValue2() { return value2; } public void setValue2(double value2) { this.value2 = value2; } protected abstract double getResule(); } //加法 public class OperationAdd extends Operation { @Override protected double getResule() { return getValue1() + getValue2(); } } //减法 public class OperationSub extends Operation { @Override protected double getResule() { return getValue1() - getValue2(); } } //乘法 public class OperationMul extends Operation { @Override protected double getResule() { return getValue1() * getValue2(); } } //除法 public class OperationDiv extends Operation { @Override protected double getResule() { if (getValue2() != 0) { return getValue1() / getValue2(); } throw new IllegalArgumentException("除数不能为零"); } } 当我想要执行加法运算时,可以使用如下代码: ...