Java抽象工厂模式

  1. 基本定义

    抽象工厂模式是所有形态的工厂模式中最为抽
    象和最其一般性的。抽象工厂模式可以向客户端
    提供一个接口,使得客户端在不必指定产品的具
    体类型的情况下,能够创建多个产品族的产品对
    象。

  2. 编写具体代码以及测试类
    package abstractFactory;
    
    public abstract class Apple implements Fruit {
    
        public abstract void get();
    } package abstractFactory; public abstract class Banana implements Fruit { public abstract void get();
    } package abstractFactory; public interface Fruit { public void get();
    } package abstractFactory; public interface FruitFactory {
    //实例化Apple
    public Fruit getApple(); //实例化Banana
    public Fruit getBanana();
    } package abstractFactory; public class InnerApple extends Apple {
    @Override
    public void get() {
    System.out.println("长在室内的苹果");
    }
    } package abstractFactory; public class InnerBanana extends Banana {
    @Override
    public void get() {
    System.out.println("长在室内的香蕉");
    }
    } package abstractFactory; public class InnerFruitFactory implements FruitFactory {
    @Override
    public Fruit getApple() {
    return new InnerApple();
    } @Override
    public Fruit getBanana() {
    return new InnerBanana();
    }
    } package abstractFactory; public class NorthApple extends Apple { @Override
    public void get() {
    System.out.println("长在北方的苹果");
    }
    } package abstractFactory; public class NorthBanana extends Banana {
    @Override
    public void get() {
    System.out.println("长在北方的香蕉");
    }
    } package abstractFactory; public class NorthFruitFactory implements FruitFactory {
    @Override
    public Fruit getApple() {
    return new NorthApple();
    } @Override
    public Fruit getBanana() { return new NorthBanana();
    }
    } package abstractFactory; public class SouthApple extends Apple {
    @Override
    public void get() {
    System.out.println("长在南方的苹果");
    }
    } package abstractFactory; public class SouthBanana extends Banana {
    @Override
    public void get() {
    System.out.println("长在南方的香蕉");
    }
    } package abstractFactory; public class SouthFruitFactory implements FruitFactory {
    @Override
    public Fruit getApple() {
    return new SouthApple();
    } @Override
    public Fruit getBanana() {
    return new SouthBanana();
    }
    } //测试类
    package abstractFactory; public class MainClass {
    public static void main(String[] args) {
    FruitFactory ff = new NorthFruitFactory();
    Fruit apple = ff.getApple();
    apple.get(); Fruit banana = ff.getBanana();
    banana.get(); System.out.println("~~~~~~~~~~~~~~~~~~~~");
    FruitFactory bb = new SouthFruitFactory();
    Fruit apple2 = bb.getApple();
    apple2.get(); Fruit banana2 = bb.getBanana();
    banana2.get(); System.out.println("~~~~~~~~~~~~~~~~~~~~");
    //比如要增加室内innerApple,InnerBanana
    FruitFactory cc = new InnerFruitFactory();
    Fruit apple3 = cc.getApple();
    apple3.get();
    Fruit banana3 = cc.getBanana();
    banana3.get(); }
    }
  3. 模式中包含的角色及其职责

    1.抽象工厂(Creator)角色
    抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。(FruitFactory)

    2.具体工厂( Concrete Creator)角色
    具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。(InnerFruitFactory,NorthFruitFactory,SouthFruitFactory)

    3.抽象(Product)角色
    抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。(Fruit)

    4.具体产品(Concrete Product)角色
    抽象模式所创建的具体实例对象(NorthApple,NorthBanana,SouthApple,SouthBanana,InnerBanana,InnerFruitFactory)
    总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。

  4. 具体和前面两节模式相比较图形,我整理出来如下图所示:

Java抽象工厂模式的更多相关文章

  1. Java 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families ...

  2. 设计模式(四)——Java抽象工厂模式

    抽象工厂模式 1 基本介绍 1) 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类 2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合. 3) ...

  3. java 抽象工厂模式简单实例

    抽象工厂模式:提供一个创建一系列的相关的或者依赖的对象的接口,无需指定它们的具体实现类,具体的时间分别在子类工厂中产生. 类似于工厂模式:隔离了具体类的生产实现,使得替换具体的工厂实现类很容易.包含有 ...

  4. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  5. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  6. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  7. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  8. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  9. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

随机推荐

  1. Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'dataSource' of bean class [com.liuyang.jdbc.PersonDao]: No property 'dataSource

    这个错误是说我的启动失败了.这类问题要从配置文件中开始找原因,我用的是spring框架,所以我从application.中找的原因 然后对比路径,对比文件的命名和id,都没有问题,为什么会在启动的时候 ...

  2. 教你把p标签的一行字掰弯文字换行): word-wrap: break-word;

    1 使用前的p是这样: 2  使用后: p{ word-wrap: break-word; overflow: hidden; } 3  又想变直: p{ word-wrap: normal; ove ...

  3. DIV+CSS实战(一)

    一.说明 作为一个后台的程序员,我也是很少写前端,最近有一个项目,前端主要是由我来负责,就把我在项目中所学到的东西,记录下来!我的页面要嵌入到另一个系统中,所以,并不是按照传统的top,left,co ...

  4. MarkdownPad 2.x破解下载

    Markdown是一种轻量级的标记语言,目前有不少Markdown编辑器,其他的编辑器,诸如:Notepad++.Sublime Text 2也通过插件添加了支持.Markdown的特点就是易读易写, ...

  5. WriteableBitmap(二) 实例

    使用前面定义的WriteableBitmap,我们可以很容易地创建一个足够容纳整个100 x 100图像的数组: byte[] pixels = new byte[wbmap.PixelHeight* ...

  6. 20155223 2016-2017-2 《Java程序设计》第9周学习总结

    20155223 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC--Java数据库连接是用于执行SQL的解决方案,开发人员无需接触底层数据 ...

  7. linux系统编程之信号(七):被信号中断的系统调用和库函数处理方式

        一些IO系统调用执行时, 如 read 等待输入期间, 如果收到一个信号,系统将中断read, 转而执行信号处理函数. 当信号处理返回后, 系统遇到了一个问题: 是重新开始这个系统调用, 还是 ...

  8. 在AbpZero中hangfire后台作业的使用——开启hangfire

    AbpZero框架已经集成了hangfire,但它默认是关闭的,我们可以在运行站点下的Startup.cs文件中把这行代码注释取消就行了,代码如下:     //Hangfire (Enable to ...

  9. dorado-menu

    1.menu控件是一个下拉菜单控件,可以设置数icon(图标),click事件,Dorado事件中都有self和arg两个参数,其中self是当前控件本身 2.menu控件可以和toolBar结合使用 ...

  10. image的关闭和开启

    image1.gameObject.SetActive(true);开启image,image1.gameObject.SetActive(false);关闭image,可以用事件或者button开启 ...