`
zhangwei_david
  • 浏览: 476126 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 设计模式-抽象工厂(Abstract Factory)

 
阅读更多

   在设计模式一书中是这样描述抽象工厂的意图的: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的实现类。

  使用场景:一个系统要独立于它的产品创建、组合和表示时,且一个该系统提供多个产品系列,系统每次仅消费其中一个系类时可以使用抽象工厂模式。

      假设现在手机厂商在生产手机(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

 

 

优点:

  1. 分离了具体的类
  2. 易于更换产品系列
  3. 有利于维护产品一致性

缺点:

  1. 产品簇中难以增加新的产品

抽象工厂和工厂方法的比较:

     抽象工厂和工厂方法都分离了工厂接口和具体实现,不同点是工厂方法中仅抽象一个产品,有多个产品的实现,在抽象工厂中有多个抽象产品,有多组产品实现,但是具体工厂只能提供其中一组产品!

 

 

 

 

1
0
分享到:
评论
1 楼 boonya 2015-03-01  
清晰易懂,very nice!

相关推荐

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    java设计模式-抽象工厂模式

    总的来说,抽象工厂模式在Java中是一种非常实用的设计模式,它可以帮助我们封装产品的创建过程,降低系统间的耦合度,同时提供了更好的可扩展性,使得添加新的产品族或者产品变得更加容易。在处理具有多种变体的复杂...

    Java设计模式-抽象工厂

    **Java设计模式——抽象工厂** 在软件工程中,设计模式是一种在特定场景下解决常见问题的模板或蓝图。抽象工厂模式是设计模式中的一种结构型模式,它提供了一个创建对象族的接口,但允许子类决定实例化哪一个类。这...

    Java设计模式教程 - Java设计模式 - 抽象工厂模式

    抽象工厂模式是Java设计模式中的一种创建型模式,它提供了创建对象族的接口,而具体的对象族由子类决定。这种模式的主要目的是隔离接口与实现,使得客户端代码在更换产品族时无需修改,增强了软件的可扩展性和可维护...

    设计模式之-抽象工厂-AbstractFactory

    抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...

    java常用设计模式-抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式...

    设计模式-抽象工厂模式javademo

    抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...

    设计模式 - 抽象工厂模式

    设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...

    设计模式-抽象工厂-Java 源码

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而具体的对象族由子类决定。这种模式允许系统在不指定具体产品的前提下,能够创建一系列相关或相互依赖的对象,同时避免了硬编码所造成的...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。

    设计模式-抽象工厂模式(讲解及其实现代码)

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...

    设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...

    走进设计模式之抽象工厂(Abstract Factory)

    在众多设计模式中,抽象工厂(Abstract Factory)模式是一种创建型模式,它为创建一组相关或相互依赖的对象提供一个接口,而无需指定它们的具体类。这种模式允许客户端使用抽象接口与具体实现解耦,使得系统更易于...

    c++设计模式-抽象工厂方法

    **抽象工厂方法(Abstract Factory Pattern)**是一种创建型设计模式,它提供了一种创建对象族的接口,而具体的对象族由子类决定。在C++中,这种模式可以帮助我们隔离对象的创建和使用,使得代码更加灵活,易于扩展...

    创建型-抽象工厂模式(Abstract Factory)

    此外,抽象工厂模式还可以与其他设计模式结合使用,比如工厂方法模式(Factory Method Pattern),在某些情况下,可以将抽象工厂模式的抽象工厂类设计为工厂方法模式,让子类决定实例化哪一个类。同时,抽象工厂模式...

    从哲学角度学习设计模式-抽象工厂

    在众多设计模式中,“抽象工厂”(Abstract Factory)模式是一种创建型模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不必指定它们的具体类。这一模式深受哲学的影响,特别是“形而上学”的概念,探讨了...

    iOS设计模式-抽象工厂

    本篇主要探讨的是“抽象工厂”设计模式,这是一种创建型设计模式,它提供一个接口用于创建相关或依赖对象的家族,而无需指定具体类。 抽象工厂模式的核心概念是“工厂”,它不直接生产产品,而是提供一个创建产品的...

    设计模式--抽象工厂

    "抽象工厂"是设计模式中的一种,属于创建型模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这个模式的核心在于隔离了产品对象的创建过程,使得系统对具体产品的依赖最小化,从而增强了系统的灵活性和...

    抽象工厂AbstractFactory

    抽象工厂(Abstract Factory)模式是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪一个类。这种模式是基于对象的抽象,而不是具体的类,因此,它允许创建一系列相关的对象,而无需指定...

    java设计模式---诙谐易懂版

    例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...

Global site tag (gtag.js) - Google Analytics