java设计模式之抽象工厂模式
2016-09-01 11:07
621 查看
定义:Provide an interface for creating families of related or dependent objects without specifying their concrete classes. 即为一组相关或相互依赖的对象提供一个实例化接口,而且无需指定他们的具体类。说白了,相对于之前提到的工厂方法模式,抽象工厂模式在创建对象实例时无需传入任何参数,即建立起与待实例化对象的一一对象关系,而在工厂模式中createProduct(Class c)方法还需传入一个具体的Class类名,所以工厂模式可以一对多。 差别仅此而已。下面用一个例子说明:
类图:
对比工厂模式,很容易理解这种模式,废话不多说,直接上测试代码:
AbstractFactory.java
AbstractProduct.java
ProductA.java
ProductB.java
ConcreteFactory.java
测试代码:
测试结果:
在这个例子中,抽象工厂方法中分别定义了创建A类产品以及B类产品实例的方法,如果还有C类产品,则在抽象工厂类中继续添加创建C类产品的方法,如果是还有A1,A2…An,B1,B2…Bn系的产品呢?则新建n个继承自抽象工厂的子类,第n个工厂实现类创建A类以及B类产品实例方法分别返回An以及Bn产品类实例。这也就是抽象工厂模式定义里提到的创建一组相关或相互依赖的对象。
优点:封装性较工厂方法模式更好一点,毕竟创建对象实例时连类名都不用知道。缺点也在于这一点,创建对象实例的方法只能是一对一的关系,导致系统的复杂性增加了。另外,如果一开始只在抽象工厂类里定义了A和B类产品创建实例的方法,后面也多了个C类产品,这时候就需要新增C类产品实例的抽象创建方法,此时将要对所有抽象工厂的子类进行改写,这个也是比较麻烦的。
应用环境:这个也很明显,就是应用于在需要创建明确几组对象的时候。
类图:
对比工厂模式,很容易理解这种模式,废话不多说,直接上测试代码:
AbstractFactory.java
/** * Created by Song on 2016/9/1. * 抽象工厂类 */ public abstract class AbstractFactory { //创建A类产品实例 public abstract AbstractProduct createProductA(); //创建B类产品实例 public abstract AbstractProduct createProductB(); }
AbstractProduct.java
/** * Created by Song on 2016/9/1. * 抽象产品类 */ public abstract class AbstractProduct { //自我介绍 public abstract void introduction(); }
ProductA.java
/** * Created by Song on 2016/9/1. * A类产品 */ public class ProductA extends AbstractProduct { @Override public void introduction() { System.out.println("这是产品A"); } }
ProductB.java
/** * Created by Song on 2016/9/1. * B类产品 */ public class ProductB extends AbstractProduct { @Override public void introduction() { System.out.println("这是产品B"); } }
ConcreteFactory.java
/** * Created by Song on 2016/9/1. * 具体工厂实现类 */ public class ConcreteFactory extends AbstractFactory { @Override public AbstractProduct createProductA() { return new ProductA(); } @Override public AbstractProduct createProductB() { return new ProductB(); } }
测试代码:
public class Main { public static void main(String [] args){ //创建具体工厂 AbstractFactory factory = new ConcreteFactory(); //获取产品实例 ProductA productA = (ProductA) factory.createProductA(); ProductB productB = (ProductB)factory.createProductB(); //打印产品信息 productA.introduction(); productB.introduction(); } }
测试结果:
在这个例子中,抽象工厂方法中分别定义了创建A类产品以及B类产品实例的方法,如果还有C类产品,则在抽象工厂类中继续添加创建C类产品的方法,如果是还有A1,A2…An,B1,B2…Bn系的产品呢?则新建n个继承自抽象工厂的子类,第n个工厂实现类创建A类以及B类产品实例方法分别返回An以及Bn产品类实例。这也就是抽象工厂模式定义里提到的创建一组相关或相互依赖的对象。
优点:封装性较工厂方法模式更好一点,毕竟创建对象实例时连类名都不用知道。缺点也在于这一点,创建对象实例的方法只能是一对一的关系,导致系统的复杂性增加了。另外,如果一开始只在抽象工厂类里定义了A和B类产品创建实例的方法,后面也多了个C类产品,这时候就需要新增C类产品实例的抽象创建方法,此时将要对所有抽象工厂的子类进行改写,这个也是比较麻烦的。
应用环境:这个也很明显,就是应用于在需要创建明确几组对象的时候。
相关文章推荐
- Java设计模式-----Abstract Factory抽象工厂模式
- java设计模式---Abstract Facotry Pattern---抽象工厂模式
- Java与设计模式(03)--抽象工厂模式
- Java设计模式二:抽象工厂模式(Abstract Factory)/工厂方法(Factory Method)
- Java设计模式 - 抽象工厂模式(Abstract Factory)
- Java 可复用的面向对象的设计模式之 工厂模式Factory详解 :简单工厂模式 工厂方法模式 抽象工厂模式
- java设计模式之工厂方法模式以及简单工厂模式还有抽象工厂模式
- java设计模式——抽象工厂模式
- JAVA设计模式 — 抽象工厂模式(Abstract Factory)
- Java设计模式之三(抽象工厂模式)
- java 设计模式 学习笔记(3) 抽象工厂模式
- 浅谈 java 设计模式--抽象工厂模式(AbstractFactory pattern)
- Java设计模式圣经连载(03)-抽象工厂模式
- java 设计模式-创建模式之抽象工厂模式
- 23种经典设计模式的java实现_1_抽象工厂模式
- Java设计模式-----Abstract Factory抽象工厂模式
- Java设计模式-----Abstract Factory抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式之抽象工厂模式
- JAVA设计模式☞☞工厂方法模式和抽象工厂模式区别