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、抽象工厂用来创建整个产品家族和将制造的相关产品集合起来,故当要改变产品时(新增,修改)就必须改变接口,抽象工厂中的产品经常会用工厂方法实现;工厂方法将客户代码从需要实例化的具体子类中解耦,或者目前还不知道将来需要实例化那些具体类时使用
==========================================================
踏踏实实做事,健健康康生活=========================================================