设计模式——工厂模式

来源:互联网 发布:如何看自己淘宝的等级 编辑:程序博客网 时间:2024/06/01 10:35

1、工厂模式定义

定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法让类把实例化推迟到子类。
用途:工厂模式用于封装对象的创建,也即工厂方法模式封装了具体类型的实例化。
特点:工厂模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程进行封装的目的。其中“决定”并不是指该模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需要知道实际创建的产品是哪一个。

2、工厂模式分类

工厂模式主要是为创建对象提供了接口。工厂模式可以分为以下三种:

简单工厂模式(Simple Factory):不是真正的设计模式,但能将客户程序从具体类中解耦(将实例化具体类的代码从应用中抽离,或者封装起来)。


工厂方法模式(Factory Method):工厂方法创建一个框架,让子类决定要如何实现。


抽象工厂模式(Abstract Factory)

3、为何使用工厂模式

工厂模式是我们最常用的模式之一。为什么工厂模式如此常用,因为工厂模式相当于创建实例对象的new,我们经常要根据类class来生成实例对象,如A a=new A(),而工厂模式也是用来创建实例对象的。因此以后在使用new时,可以考虑一下能否使用工厂模式,虽然这样做,可能会多做一些工作,但这会给你的系统泰来更大的可扩展性和尽量少的修改量。

以类A为例,创建A的实例对象:A a=new A();可是在实际情况中,通常在创建实例时进行的初始化工作不一定会像赋值那么简单的事,可能会是很长的一段代码,如果这样写入构造函数中,这样的代码就很难看了。初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派"切割"成每段,将每段再"封装"起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。

在例中,首先我们需要将创建实例的工作与使用实例的工作分开,也就是说,让创建实例所需要的大量初始化工作从A的构造函数中分离出去。这时我们就需要建立一个专门生产A实例的工厂,也即采用工厂模式来生成对象,不能再用上面简单new A()。

public class Factory{

  public static A creator(int which){

  //getClass 产生A 一般可使用动态类装载装入类。
  if (which==1)
    return new A1();
  else if (which==2)
    return new A2();

  }

}

工厂方法用来处理对象的创建,并将这样的行为封装在子类中。工厂方法帮助我们将产品的“实现”从“使用”中解耦。如果增加产品或者改变产品的实现,Creator并不会受到影响(因为Creator与任何ConcreteProduct之间都不是紧耦合)。
原创粉丝点击