设计模式——抽象工厂模式
抽象工厂模式是工厂相关模式的终极形态,其与工厂方法模式唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,相应的,抽象产品也不再是一个了,而是一系列相关的产品,这其实是工厂方法模式的一种扩展。
工厂方法模式针对的是一个产品等级结果,而抽象工厂模式则是针对多个产品等级结构。在编程中,通常一个产品结构表现为一个结构或者抽象类,即工厂方法模式提供的所有产品都来自同一个接口或者抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或者抽象类。
在抽象产品模式中有一个产品组的概念,所谓产品族是指位于不同产品等级结构中且功能又相关联的产品组成的家族。抽象工厂模式模式所提供的一系列产品就组成一个产品族,而工厂方法模式提供的一系列产品就是一个等级结构。
抽象工厂模式提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
抽象工厂方法也有4个角色:
① 产品族中的产品接口,可以有多个
② 产品族中产品接口的具体实现类
③ 工厂接口
④ 工厂接口的具体实现类
例子一
角色:产品A接口
package com.test.abstractFactory; public interface Button { public abstract void processEvent(); }
角色:产品B接口
1 package com.test.abstractFactory; 2 3 public interface Text { 4 public abstract void getWholeText(); 5 }
角色:产品A接口的具体实现类
1 package com.test.abstractFactory; 2 3 public class LinuxButton implements Button { 4 @Override 5 public void processEvent() { 6 System.out.println("Inside LinuxButton::processEvent() method."); 7 } 8 }
角色:产品A接口的具体实现类
1 package com.test.abstractFactory; 2 3 public class WindowsButton implements Button { 4 @Override 5 public void processEvent() { 6 System.out.println("Inside WindowsButton::processEvent() method."); 7 } 8 }
角色:产品B接口的具体实现类
1 package com.test.abstractFactory; 2 3 public class LinuxText implements Text { 4 @Override 5 public void getWholeText() { 6 System.out.println("Inside LinuxText::getWholeText() method."); 7 } 8 }
角色:产品B接口的具体实现类
1 package com.test.abstractFactory; 2 3 public class WindowsText implements Text { 4 @Override 5 public void getWholeText() { 6 System.out.println("Inside WindowsText::getWholeText() method."); 7 } 8 }
角色:抽象工厂接口
1 package com.test.abstractFactory; 2 3 public interface AbstractFactory { 4 public abstract Button createButton(); 5 public abstract Text createText(); 6 }
角色:抽象工厂的具体实现类
1 package com.test.abstractFactory; 2 3 public class LinuxFactory implements AbstractFactory { 4 @Override 5 public Button createButton() { 6 return new LinuxButton(); 7 } 8 9 @Override 10 public Text createText() { 11 return new LinuxText(); 12 } 13 }
角色:抽象工厂的具体实现类
1 package com.test.abstractFactory; 2 3 public class WindowsFactory implements AbstractFactory { 4 @Override 5 public Button createButton() { 6 return new WindowsButton(); 7 } 8 9 @Override 10 public Text createText() { 11 return new WindowsText(); 12 } 13 }
测试,消费者
1 package com.test.abstractFactory; 2 3 public class AbstractFactoryDemo { 4 public static void main(String[] args){ 5 AbstractFactory linuxFactory = new LinuxFactory(); 6 linuxFactory.createButton().processEvent(); 7 linuxFactory.createText().getWholeText(); 8 9 AbstractFactory windowsFactory = new WindowsFactory(); 10 windowsFactory.createButton().processEvent(); 11 windowsFactory.createText().getWholeText(); 12 } 13 }
测试结果