Java:设计模式之抽象工厂模式(Abstract Factory)
2013-01-14 16:09
531 查看
模式名 | 抽象工厂(Abstract Factory) |
---|---|
定义 | 抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。 |
实例 | 如要生产大中小三种球体,可以采用抽象工厂+具体工厂来生产,不需要关注球体本身的具体实现。代替各种球体的new对象方法。允许子类选择创建对象的具体类型. |
适用场景 | · 一个系统要独立于它的产品的创建、组合和表示时。 · 一个系统要由多个产品系列中的一个来配置时。 · 需要强调一系列相关的产品对象的设计以便进行联合使用时。 · 提供一个产品类库,而只想显示它们的接口而不是实现时。 |
结构层次 | |
优点 | “工厂”是创建产品(对象)的地方,其目的是将产品的创建与产品的使用分离。抽象工厂模式的目的,是将若干抽象产品的接口与不同主题产品的具体实现分离开。这样就能在增加新的具体工厂的时候,不用修改引用抽象工厂的客户端代码。 使用抽象工厂模式,能够在具体工厂变化的时候,不用修改使用工厂的客户端代码,甚至是在运行时。 能够方便的批量构建对象和统一管理对象的生命周期。 |
局限性 | 在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。 实现相对复杂。 抽象导致性能下降。 创建对象的接口的寓意无法与构造函数的命名相比较。一般命名:getInstance,creator |
package com.freestudio.designpattern; abstract class Ball { public final static int BIG_BALL = 1; public final static int MEDIUM_BALL = 2; public final static int SMALL_BALL = 3; protected void playBall() { System.out.println("playBall:" + this.getClass().getSimpleName()); } } class BigBall extends Ball { private BigBall() { // 禁止直接构造对象 } public static Ball getInstance() { return new BigBall(); } protected void playBall() { System.out.println("playBall:" + this.getClass().getSimpleName()); } } class MediumBall extends Ball { private MediumBall() { // 禁止直接构造对象 } public static Ball getInstance() { return new MediumBall(); } protected void playBall() { System.out.println("playBall:" + this.getClass().getSimpleName()); } } class SmallBall extends Ball { private SmallBall() { // 禁止直接构造对象 } public static Ball getInstance() { return new SmallBall(); } protected void playBall() { System.out.println("playBall:" + this.getClass().getSimpleName()); } }
抽象工厂类:
package com.freestudio.designpattern; //定义一个抽象工厂 public abstract class BallFactory { //生产产品方法 public abstract Ball creator(); }
具体工厂类:
package com.freestudio.designpattern; //实现工厂 public class BigBallFactory extends BallFactory { @Override public Ball creator() { return BigBall.getInstance(); } }
package com.freestudio.designpattern; //实现工厂 public class SmallBallFactory extends BallFactory { @Override public Ball creator() { return SmallBall.getInstance(); } }
测试代码:
package com.freestudio.designpattern; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub TestFactory(); //TestSingleTon(); } static void TestFactory() { //实例化一个具体工厂 BigBallFactory bigFactory = new BigBallFactory(); //生产产品 Ball bigBall = bigFactory.creator(); //使用产品 bigBall.playBall(); //实例化一个具体工厂 SmallBallFactory smallFactory = new SmallBallFactory(); //生产产品 Ball smallBall = smallFactory.creator(); //使用产品 smallBall.playBall(); } }
参考:抽象工厂
相关文章推荐
- Java设计模式——抽象工厂模式(Abstract Factory Pattern)
- java设计模式(二)——抽象工厂模式
- Java设计模式 -- 抽象工厂模式
- java设计模式之---------------抽象工厂模式
- java之设计模式工厂三兄弟之抽象工厂模式
- java设计模式 -------- 创建模式 之 抽象工厂模式
- JAVA设计模式:抽象工厂模式
- Java设计模式-----Abstract Factory抽象工厂模式
- Java设计模式-抽象工厂模式
- Java设计模式(3)之工厂方法模式&抽象工厂模式学习总结
- JAVA设计模式之抽象工厂模式
- Java设计模式之三(抽象工厂模式)
- JAVA--抽象工厂模式--设计模式二
- JAVA设计模式是个什么玩意儿_02_抽象工厂模式
- 重学java23种设计模式(2)抽象工厂模式
- java设计模式---抽象工厂模式
- java设计模式---抽象工厂模式
- Java设计模式圣经连载(03)-抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式百例 - 抽象工厂模式