设计模式-> 抽象工厂

来源:互联网 发布:淘宝上的伟哥是真的吗 编辑:程序博客网 时间:2024/04/19 07:46

1    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2   在以下情况可以使用Abstract Factory模式

• 一个系统要独立于它的产品的创建、组合和表示时。
• 一个系统要由多个产品系列中的一个来配置时。
• 当你要强调一系列相关的产品对象的设计以便进行联合使用时。

• 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

3   结构


4  代码示例

abstract class AbstractProductA{public abstract void operationA1();public abstract void operationA2();}class ProductA1 extends AbstractProductA{ProductA1(String arg){System.out.println("Hello "+arg);} // Implement the code herepublic void operationA1() { };public void operationA2() { };}class ProductA2 extends AbstractProductA{ProductA2(String arg){System.out.println("Hello "+arg);} // Implement the code herepublic void operationA1() { };public void operationA2() { };}abstract class AbstractProductB{//public abstract void operationB1();//public abstract void operationB2();}class ProductB1 extends AbstractProductB{ProductB1(String arg){System.out.println("Hello "+arg);} // Implement the code here}class ProductB2 extends AbstractProductB{ProductB2(String arg){System.out.println("Hello "+arg);} // Implement the code here}abstract class AbstractFactory{abstract AbstractProductA createProductA();abstract AbstractProductB createProductB();}class ConcreteFactory1 extends AbstractFactory{AbstractProductA createProductA(){return new ProductA1("ProductA1");}AbstractProductB createProductB(){return new ProductB1("ProductB1");}}class ConcreteFactory2 extends AbstractFactory{AbstractProductA createProductA(){return new ProductA2("ProductA2");}AbstractProductB createProductB(){return new ProductB2("ProductB2");}}class FactoryMaker{private static AbstractFactory pf=null;static AbstractFactory getFactory(String choice){if(choice.equals("a")){pf=new ConcreteFactory1();}else if(choice.equals("b")){pf=new ConcreteFactory2();} return pf;}}public class Client{public static void main(String args[]){AbstractFactory pf=FactoryMaker.getFactory("a");AbstractProductA product=pf.createProductA();//more function calls on product}}

5  抽象工厂模式优缺点:

   1  从结构可以看出 , 与Client相关联的是AbstractProduct , AbstractFactory , 即通过抽象接口操纵实例。

   2   若客户想变换产品显得尤为容易, 只要变换AbstractFactory 实现对象即可 , 这得益于AbstractProduct 抽象了某类产品 , 但AbstractProduct只可使用实现它子类的产品对象 。  

   3   若系统新增产品 , 则从产品的抽象创建AbstractFactory 到 产品的具体行为 AbstractProduct都需进行修改 . 在系统产品种类较多时 , 此种设计模式欠妥 . 





原创粉丝点击