工厂模式(Factory)
概念:封装对象的创建,为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
1 简单工程模式
介绍:简单工厂不属于23种设计模式,是一种编程习惯。创建一个专门生产某个产品的类。
定义:工厂模式是由一个工厂类对象根据收到的消息决定要创建哪一个类的对象实例。类的创建依赖工厂类。
使用场景:工厂类负责创建的对象比较少,客户只需要传入工厂类参数,对于如何创建对象(逻辑)不关心。简单工厂模式很容易违反高内聚低耦合的原则,因此一般只在很简单的情况下使用。
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
实现思路:抽象产品类(也可以是接口)、多个具体的产品类、工厂类。
(1)定义接口
(2)多个具体的产品类
(3)工厂类,负责创建类
(4)使用工厂类
通过工厂类,可以很方便的生产出我们想要的对象。在普通工厂模式中,如果传递的字符串出错,则不能正确创建对象。所以这里可以对工厂类进行修改:
public class ShapeFactory{
public Shape getRectangle(){
return new Rectangle();
}
public Shape getSquare(){
return new Square();
}
public Shape getCircle(){
return new Circle();
}
}
//或者多个静态方法:不需要创建工厂类实例,直接调用相应的方法。
public class ShapeFactory{
public static Shape getRectangle(){
return new Rectangle();
}
public static Shape getSquare(){
return new Square();
}
public static Shape getCircle(){
return new Circle();
}
}
2 工厂方法模式(Factory Method)
介绍:工厂方法模式是简单工厂模式的衍生。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
定义:定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。
使用场景:1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
优点:创建对象的接口,让子类决定具体实例化的对象,把简单的内部逻辑判断移到了客户端。工厂方法模式克服了简单工厂所违背的开闭原则的缺点,又保持了封装对象创建过程的优点。扩展性高,想要增加一个产品,只要扩展一个工厂类就可以。
实现思路:有四个角色,抽象产品,具体产品,抽象工厂,具体工厂。不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品。
(1)一个抽象产品
(2)具体产品
(3)抽象工厂(接口和抽象类)
(4)具体工厂
(5)测试