在设计模式一书中是这样描述抽象工厂的意图的: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的实现类。
使用场景:一个系统要独立于它的产品创建、组合和表示时,且一个该系统提供多个产品系列,系统每次仅消费其中一个系类时可以使用抽象工厂模式。
假设现在手机厂商在生产手机(phone)的同时也生产平板(Pad)(这两个产品是一个系列,都是移动端产品),简单的定义两个产品接口
/** * * @author zhangwei_david * @version $Id: Pad.java, v 0.1 2015年2月28日 下午4:54:33 zhangwei_david Exp $ */ public interface Pad { public String getBrand(); }
/** * * @author zhangwei_david * @version $Id: Phone.java, v 0.1 2015年2月28日 下午4:28:34 zhangwei_david Exp $ */ public interface Phone { public String getBrand(); }
不同厂商生产的产品的品牌一定是不同的,定义两组具体实现类
/** * * @author zhangwei_david * @version $Id: Ipad.java, v 0.1 2015年2月28日 下午4:55:06 zhangwei_david Exp $ */ public class Ipad implements Pad { /** * @see com.pattern.create.abstractFactory.product.Pad#getBrand() */ @Override public String getBrand() { return "APPLE"; } }
/** * * @author zhangwei_david * @version $Id: Iphone4.java, v 0.1 2015年2月28日 下午4:35:50 zhangwei_david Exp $ */ public class Iphone implements Phone { private static final String BRAND = "APPLE"; /** * @see com.pattern.create.abstractFactory.product.Phone#getBrand() */ @Override public String getBrand() { return BRAND; } }
第二组产品:
/** * * @author zhangwei_david * @version $Id: MiPad.java, v 0.1 2015年2月28日 下午4:55:53 zhangwei_david Exp $ */ public class MiPad implements Pad { /** * @see com.pattern.create.abstractFactory.product.Pad#getBrand() */ @Override public String getBrand() { return "MI"; } }
/** * * @author zhangwei_david * @version $Id: MiPhone.java, v 0.1 2015年2月28日 下午4:36:50 zhangwei_david Exp $ */ public class MiPhone implements Phone { private static final String BRAND = "MI"; /** * @see com.pattern.create.abstractFactory.product.Phone#getBrand() */ @Override public String getBrand() { return BRAND; } }
通过上面两组产品可以发现,每组产品的品牌都是一致的,也就是在工厂生产的时候不可能一条生产线上生成两种不同的品牌产品(山寨除外)
定义一个抽象工厂的接口,该接口提供生产一组产品的操作
/** * * @author zhangwei_david * @version $Id: AbstractFactory.java, v 0.1 2015年2月28日 下午4:27:57 zhangwei_david Exp $ */ public interface AbstractFactory { public Phone createPhone(); public Pad createPad(); }
有两个具体实现类:
public class AppleFactory implements AbstractFactory { /** * @see com.pattern.create.abstractFactory.AbstractFactory#createPhone() */ @Override public Phone createPhone() { return new Iphone(); } /** * @see com.pattern.create.abstractFactory.AbstractFactory#createPad() */ @Override public Pad createPad() { return new Ipad(); } }
public class MiFactory implements AbstractFactory { /** * @see com.pattern.create.abstractFactory.AbstractFactory#createPhone() */ @Override public Phone createPhone() { return new MiPhone(); } /** * @see com.pattern.create.abstractFactory.AbstractFactory#createPad() */ @Override public Pad createPad() { return new MiPad(); } }
public class Client { /** * * @param args */ public static void main(String[] args) { AbstractFactory appleFactory = new AppleFactory(); System.out.println(appleFactory.createPad().getBrand() + " PAD"); System.out.println(appleFactory.createPhone().getBrand() + " PHONE"); AbstractFactory miFactory = new MiFactory(); System.out.println(miFactory.createPad().getBrand() + " PAD"); System.out.println(miFactory.createPhone().getBrand() + " PHONE"); } }
结果:
APPLE PAD APPLE PHONE MI PAD MI PHONE
优点:
- 分离了具体的类
- 易于更换产品系列
- 有利于维护产品一致性
缺点:
- 产品簇中难以增加新的产品
抽象工厂和工厂方法的比较:
抽象工厂和工厂方法都分离了工厂接口和具体实现,不同点是工厂方法中仅抽象一个产品,有多个产品的实现,在抽象工厂中有多个抽象产品,有多组产品实现,但是具体工厂只能提供其中一组产品!
相关推荐
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
NULL 博文链接:https://zhouhaitao.iteye.com/blog/1003684
博客 走进设计模式之抽象工厂(Abstract Factory) 对应代码
设计模式举例 抽象工厂模式 代码+用例图 设计模式, 设计模式举例-抽象工厂模式(有图有真相)
C#设计模式之抽象工厂(abstract factory)模式示例源代码
抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法
设计模式C++学习之抽象工厂模式(AbstractFactory)
Abstract Factory模式 1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来...
设计模式抽象工厂模式(AbstractFactory)源代码
C++设计模式课件9_Abstract Factory_抽象工厂.pdf
要好好去读上面那个实例,虽然有点绕嘴,其实只要用心去读,分清了抽象工厂模式的各个角色,对理解设计模式是非常重要的。理解头绪,然后接合简单工厂模式、工厂方法模式对工厂家族的了解,再加上抽象工厂模式的意图...
3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况: 1. 在编码时不...
c#设计模式 工厂模式 抽象工厂(Abstract Factory)模式 引进抽象工厂模式
使用startuml 实现abstract factory 图,并使用C++实现。
还是一个很简单的例子 博文链接:https://schnauzer.iteye.com/blog/111891
设计模式 抽象工厂 Abstract Factory 抽象工厂模式
- 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合...
java设计模式,工厂模式(简单工厂、工厂、抽象工厂)示例源码 //简单工厂 // ICar car = CarSimpleFactory.create(CarSimpleFactory.UPTYPE); //工厂 AbstractFactory factory = new MidFactory(); ICar car =...
抽象工厂模式可以实现不同数据库之间的无缝移植。 该项目是在三层架构的基础上改进的。希望对初学者有帮助。
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责...