模式意图
提供对象的使用接口,隐藏对象的创建过程。
模式结构
AbstractFactory 提供创建对象的接口。
ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。
AbstractProduct 提供对象的使用接口。
ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。
Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。
适合场景
1 系统独立于它的产品创建、组合和表示。即无需关心内部对象时如何创建的,怎么创建的,什么含义。
2 系统需要多个产品组合中的一个配置。由于对象很多,能够组合出的组合非常多,而系统只是使用某一个组合。
3 强调的对象的组合结果,而不是他们具体的接口和实现。
代码结构
AbstractFactory.java
interface AbstractFactory { public AbstractProductA CreateProductA(); public AbstractProductB CreateProductB(); }
ConcreteFactory.java
class ConcreteFactory1 implements AbstractFactory{ @Override public AbstractProductA CreateProductA() { return new ConcreteProductA1(); } @Override public AbstractProductB CreateProductB() { return new ConcreteProductB1(); } }
AbstractProduct.java
interface AbstractProductA { public void use(); } interface AbstractProductB { public void use(); }
ConcreteProduct.java
class ConcreteProductA1 implements AbstractProductA{ @Override public void use() { // TODO Auto-generated method stub System.out.println("use A1 product!"); } } class ConcreteProductB1 implements AbstractProductB{ @Override public void use() { // TODO Auto-generated method stub System.out.println("use B1 product!"); } }
使用方式
public static void main(String[] args){ AbstractProductA pa; AbstractProductB pb; AbstractFactory fa1 = new ConcreteFactory1(); pa = fa1.CreateProductA(); pb = fa1.CreateProductB(); pa.use(); pb.use(); AbstractFactory fa2 = new ConcreteFactory2(); pa = fa2.CreateProductA(); pb = fa2.CreateProductB(); pa.use(); pb.use(); }
全部代码
1 package com.designer; 2 interface AbstractFactory { 3 public AbstractProductA CreateProductA(); 4 public AbstractProductB CreateProductB(); 5 } 6 interface AbstractProductA { 7 public void use(); 8 } 9 interface AbstractProductB { 10 public void use(); 11 } 12 class ConcreteFactory1 implements AbstractFactory{ 13 14 @Override 15 public AbstractProductA CreateProductA() { 16 return new ConcreteProductA1(); 17 } 18 19 @Override 20 public AbstractProductB CreateProductB() { 21 return new ConcreteProductB1(); 22 } 23 24 } 25 class ConcreteFactory2 implements AbstractFactory{ 26 27 @Override 28 public AbstractProductA CreateProductA() { 29 return new ConcreteProductA2(); 30 } 31 32 @Override 33 public AbstractProductB CreateProductB() { 34 return new ConcreteProductB2(); 35 } 36 37 } 38 class ConcreteProductA1 implements AbstractProductA{ 39 40 @Override 41 public void use() { 42 // TODO Auto-generated method stub 43 System.out.println("use A1 product!"); 44 } 45 46 } 47 class ConcreteProductA2 implements AbstractProductA{ 48 49 @Override 50 public void use() { 51 // TODO Auto-generated method stub 52 System.out.println("use A2 product!"); 53 } 54 55 } 56 class ConcreteProductB1 implements AbstractProductB{ 57 58 @Override 59 public void use() { 60 // TODO Auto-generated method stub 61 System.out.println("use B1 product!"); 62 } 63 64 } 65 class ConcreteProductB2 implements AbstractProductB{ 66 67 @Override 68 public void use() { 69 // TODO Auto-generated method stub 70 System.out.println("use B2 product!"); 71 } 72 73 } 74 public class Client { 75 public static void main(String[] args){ 76 AbstractProductA pa; 77 AbstractProductB pb; 78 79 AbstractFactory fa1 = new ConcreteFactory1(); 80 pa = fa1.CreateProductA(); 81 pb = fa1.CreateProductB(); 82 pa.use(); 83 pb.use(); 84 85 AbstractFactory fa2 = new ConcreteFactory2(); 86 pa = fa2.CreateProductA(); 87 pb = fa2.CreateProductB(); 88 pa.use(); 89 pb.use(); 90 91 } 92 }