`

java设计模式 抽象工厂模式

阅读更多
1.意图
  提供一个创建一系列相关或相互依赖的对象的接口,而不需要制定具体类。在java中,大家都知道创建一个对象是使用new来定义的,如果我们在代码中使用new操作符,那么我们所编写的代码就成了硬编码,这样不仅日后不易扩展,而且维护修改麻烦更大。如果我们能够找到一个专门负责创建产品的类(Factory),让这个类(Factory)和客户打交道,这个时候,客户只要知道自己想要什么,这个类(Factory)就可以给你。可以简单的说就是把new操作符集中在(Factory)这个类中,他里边可能会是这样写的:
A  getA() {return new A()}; B getB(){return new B()}等等。

2.动机
   我们在什么情况下使用该方法,而且为什么要使用呢?
   假如我们现在要生产汽车Car,这个Car有车门(Door) 车轮(Wheel), 引擎(engin)。
如果按照我们自己的方法去实现,可能是这样实现的:
createCar(){ d = new Door ;w = new Wheel(); e = new Engin()c = new Car(d,w,e);return c}.这里的客户端代码是创建车,也就是createCar方法。这个时候,我们应该觉着没什么问题,我们的车很好的创建了,但是我们也应该知道,这里边我们使用了硬编码,就是使用了具体类。如果说我们现在要改变一下车门的生产厂商,也就是一个新的door类,我们定义为NewDoor,或者NewEngin 或者NewWheel?那么这个时候我们该怎么办呢?我们能做的就是在客户端修改一下创建createCar方法(重载),这样如果我们不停的修改部件,就需要不停的去实现createCar方法,也就是客户端一直在变。如果我们提供一个接口,得到Car的组件,这样,当我们需要修改这些组件的供应商时,就不需要修改客户端,而是从新继承一个新的子类,在子类中修改重新相应组件的创建方法。而客户端却不需要做修改。当然这个时候客户端得知道要创建什么样的车,也就是使用什么样的工厂类。
这个时候的现实如下,因为现在是工厂给我创建对象,所以我们首先创建工厂类,
public interface AbstractFactory
{
   public Door   getDoor();public Wheel getWheel();public Engin getEngi();
}//注意我们提供创建对象的接口,而不提供具体实现,具体实现由子类去实现。
具体子类为:比如说现在要有BMW的Engin BC的Door  BSJ的Wheel,则这个类实现如下:
public class FirstAbstractFactory{
public Door getDoor(){ return new BCDoor()}
public Wheel getWheel(){return new BSJWheel()}
public Engin getEngin(){return new BMWEngin()}
}
所以你想要什么样的车子,只要自己继承接口,然后用自己的类实现,就ok了
我们在看客户端代码,这个时候,客户端只要知道有工厂这么个东西,就可以了,所以客户端需要一个工厂的参数,形式可以如下:
createCar(AbstrackFactory af){ return Car(af.getDoor(),af.getWheel(),af.getEgin()) };
我可以看到,如果需要修改车内部组成情况,客户端只要修改一快地方,就ok了。
现在我们想想,这个过程到底给我们带来了什么好处呢?从我们编程的角度看,这样弄反而增加了我们编程的难度,让我多少转了一圈,然而他带来的好处是:容易扩展,修改小,客户端使用方便,其实这也正是设计模式的特点,就是说设计模式不是让一些框架一样,让你编程变的简单,相反他会使你的编程变难,而这样带来的好处是,软件易升级,维护和扩展。
3.优点及缺点
    其他根据上面分析,我们很容易得知:
     。容易交换产品系列,上面的例子我们只需要重写一个方法,就完成了,
     。是整体配置一直,也就说什么什么样的工厂创建的车都完成一样。
     。缺点,添加新产品对象时,难以扩展抽象工厂以便生产新种类的产品,因为AbstractFactory接口规定了所有可能被创建的产品集合,要支持新产品就要对该接口进行扩展,这涉及到对AbstractFactory及其所有子类进行修改,属于不便(违反了接口不便以及OCP开放封闭原则) 。所有实现了这个类的子类,都需要修改,因为父类添加了一个新方法。
4.适用性
   1.当一个系统独立于他的产品的创建,组合和表示时
   2.当一个系统需要一些产品中的一个配置时,
   3.当你创建一个类库时,只给客户提供接口
  其实我们可以看出,这个形式是一个工厂创建多个产品,相当于一个全能类,也叫上帝类,我叫这种模式为杂货店,因为他可以生产多种产品,而工厂方法模式,相当于专卖店,只能买一种产品,比如去李宁专卖店只能买到李宁的不能nike的,
以上内容是我个人在学习时总结,如果有不当之处,请多多赐教!
 
    
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics