抽象工厂设计模式

来源:互联网 发布:网络与新媒体专业介绍 编辑:程序博客网 时间:2024/06/16 06:46

抽象工厂设计模式

传说中”造人”问题

package com.cloud.model3;

publicclass Demo1 {

   publicstatic void main(String[] args) {

      HumanFactory humanFactory = new FemalFactory();

      Human human = humanFactory.createWhiteHuman();

      human.color();

      human.sex();

      human.talk();

   }

}

/********************************************

 * 对人类的描述

 */

interface Human{

   publicvoid color();

   publicvoid talk();

   publicvoid sex();

}

abstractclass WhiteHuman implements Human{

   publicvoid color(){

      System.out.println("白色人种...");

   }

   publicvoid talk(){

      System.out.println("说话...");

   }

}

abstractclass BlackHuman implements Human{

   publicvoid color(){

      System.out.println("黑色人种...");

   }

   publicvoid talk(){

      System.out.println("说话...");

   }

}

class FemalWhiteHumanextends WhiteHuman{

   @Override

   publicvoid sex() {

      System.out.println("白色人种中男性...");

   }

}

class MaleWhiteHumanextends WhiteHuman{

   @Override

   publicvoid sex() {

      System.out.println("白色人种中女性...");

   }

}

/*****************************************************

 * 工厂描述

 */

interface HumanFactory{

   public Human createWhiteHuman();

   public Human createBlackHuman();

}

class FemalFactoryimplements HumanFactory{

   /**

    * 男性:白色人种

    */

   @Override

   public Human createWhiteHuman() {

      returnnew FemalWhiteHuman();

   }

   /**

    * 男性:黑色人种

    */

   @Override

   public Human createBlackHuman() {

      returnnew FemalWhiteHuman();

   }

}

抽象工厂概念

抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。一定要注意,这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法

 

经典代码

package com.cloud.model3;

publicclass Demo2 {}

abstractclass AbstractProduct1{

   publicvoid commonMethod(){}

   publicabstract void otherMethod();

}

class Product1extends AbstractProduct1{

   @Override

   publicvoid otherMethod() {}

}

class Product2extends AbstractProduct1{

   @Override

   publicvoid otherMethod() {}

}

abstractclass AbstractFactory{

   publicabstract AbstractProduct1 createProduct1();

}

class Factory1extends AbstractFactory{

   @Override

   public AbstractProduct1 createProduct1() {

      returnnew Product1();

   }

}

 

抽象工厂模式使用条件

  1.一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。

  2.这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

  3.同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。(比如:Intel主板必须使用Intel CPU、Intel芯片组)

4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

 

抽象工厂模式的优点

分离接口和实现

  客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。

 

使切换产品族变得容易

  因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。

 

抽象工厂模式的缺点

不太容易扩展新的产品

  如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

0 0
原创粉丝点击