java抽象工厂模式

意图:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
适用性:
1、一个系统要独立于它的产品的创建、组合和表示时。
2、一个系统要由多个产品系列中的一个来配置时。
3、当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4、当你提供一个产品类库,而只想显示它们的接口而不是实现时。
结构图:

 

实例:

1 package com.test.patten.adstractfactory;
2 
3 public interface AbstractFactory {
4     AbstractProductA createProductA();
5     AbstractProductB createProductB();
6 }
 1 package com.test.patten.adstractfactory;
 2 
 3 public class ConcreteFactory1 implements AbstractFactory {
 4 
 5     @Override
 6     public AbstractProductA createProductA() {
 7         return new ProductA1();
 8     }
 9 
10     @Override
11     public AbstractProductB createProductB() {
12         return new ProductB1();
13     }
14 }
 1 package com.test.patten.adstractfactory;
 2 
 3 public class ConcreteFactory2 implements AbstractFactory {
 4 
 5     @Override
 6     public AbstractProductA createProductA() {
 7         return new ProductA2();
 8     }
 9 
10     @Override
11     public AbstractProductB createProductB() {
12         return new ProductB2();
13     }
14 }
1 package com.test.patten.adstractfactory;
2 
3 public interface AbstractProductA {
4 
5 }
1 package com.test.patten.adstractfactory;
2 
3 public interface AbstractProductB {
4 
5 }
1 package com.test.patten.adstractfactory;
2 
3 public class ProductA1 implements AbstractProductA {
4     
5     public ProductA1() {
6         System.out.println("我是产品A1");
7     }
8     
9 }
1 package com.test.patten.adstractfactory;
2 
3 public class ProductA2 implements AbstractProductA {
4 
5     public ProductA2() {
6         System.out.println("我是产品A2");
7     }
8     
9 }
1 package com.test.patten.adstractfactory;
2 
3 public class ProductB1 implements AbstractProductB {
4     
5     public ProductB1() {
6         System.out.println("我是产品B1");
7     }
8     
9 }
1 package com.test.patten.adstractfactory;
2 
3 public class ProductB2 implements AbstractProductB {
4     
5     public ProductB2(){
6         System.out.println("我是产品B2");
7     }
8     
9 }
 1 package com.test.patten.adstractfactory;
 2 
 3 public class Client {
 4     public static void main(String args[]){
 5         //我需要ProductA1,ProductB1来完成我的项目
 6         AbstractFactory f1 = new ConcreteFactory1();
 7         AbstractProductA a1 = f1.createProductA();
 8         AbstractProductB b1 = f1.createProductB();
 9         
10         //我需要ProductA2,ProductB2来完成我的项目
11         AbstractFactory f2 = new ConcreteFactory2();
12         AbstractProductA a2 = f2.createProductA();
13         AbstractProductB b2 = f2.createProductB();
14     }
15 }

输出:

我是产品A1
我是产品B1
我是产品A2
我是产品B2

抽象工厂与工厂方法的异同:
1、抽象工厂和工厂方法都用来创建对象,抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的的方法中;工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象
2、抽象工厂用来创建整个产品家族和将制造的相关产品集合起来,故当要改变产品时(新增,修改)就必须改变接口,抽象工厂中的产品经常会用工厂方法实现;工厂方法将客户代码从需要实例化的具体子类中解耦,或者目前还不知道将来需要实例化那些具体类时使用

原文地址:https://www.cnblogs.com/ikuman/p/2922622.html