【前言】

上次针对自己的理解书写一篇工厂模式的文章,后面对于工厂模式进行更加多的学习,于是了解到了抽象工厂模式。其实网上大多数人们都是抽象工厂模式是工厂模式的升级版本,虽然我并不知道所说的升级是什么意思,但是升级给我一种模糊的感觉。

学习了解抽象工厂模式还是不容易,我前前后后花了好几天去思考,阅览相关的代码例子,才对抽象工厂模式有一点了解。

为了准确理解升级这个词在工厂模式上的意思,我认为这样表示更好:多工厂模式(一个接口有多个工厂类,每个工厂类都可以创建接口的实例)

虽然理解了抽象工厂模式,但是我还是想不到在Android开发种和业务相互结合的应用情景,这个问题我会继续深入思考。

【特点】

1. 抽象工厂模式拥有工厂模式的特点

2.一个接口对应有多个工厂,可以归纳为一对多关系

3. 抽象工厂模式可以使代码逻辑清楚,但是接口增加分类会使多次需要修改和增加工厂类

【适用】

1.接口的业务实现产生分类的概念,每种分类都有对应的一个以上实现类。

【图解】

基本形式:

特殊形式:

【例子】

// 图片二值化接口(黑白化)
public interface Binarization{
    public Image getBinarizationImage();
}

// 速度优先的算法(分类一)
public abstract class SpeedBinarization implements Binarization{

}

// 空间优先的算法(分类二)
public abstract class SpaceBinarization implements Binarization{

}

// 速度优先算法1
public class SpeedAlgorithm1 extends SpeedBinarization{
    public Image getBinarizationImage(){
        // do some thing
    }
}

// 速度优先算法2
public class SpeedAlgorithm2 extends SpeedBinarization{
    public Image getBinarizationImage(){
        // do some thing
    }
}

// 空间优先算法1
public class SpaceAlgorithm1 extends SpaceBinarization{
    public Image getBinarizationImage(){
        // do some thing
    }
}

// 空间优先算法2
public class SpaceAlgorithm2 extends SpaceBinarization{
    public Image getBinarizationImage(){
        // do some thing
    }
}
// 抽象工厂
public interface BinarizationFactory{
    public Binarization getBinarization(String name);
}

// 速度优先的工厂
public class SpeedFactory implements BinarizationFactory{
    public Binarization getBinarization(String name){
        if(name.equals("one")){
            return new SpeedAlgorithm1();
        }else if(name.equals("two")){
            return new SpeedAlgorithm2();
        }
        return null;
    }
}

// 空间优先的工厂
public class SpaceFactory implements BinarizationFactory{
    public Binarization getBinarization(String name){
        if(name.equals("one")){
            return new SpaceAlgorithm1();
        }else if(name.equals("two")){
            return new SpaceAlgorithm2();
        }
        return null;
    }
}
// 抽象工厂创建器public class BinarizationFactoryCreator{
     public static BinarizationFactory getFactory(String factory){
         if(factory.equals("speed")){
             return new SpeedFactory();
         }else if(factory.equals("space")){
             return new SpaceFactory();
         }
         return null;
     }
}    

【设计模式】抽象工厂模式(Abstract Factory Pattern)的更多相关文章

  1. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  2. C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...

  3. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  4. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  5. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  6. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  7. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  8. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  9. Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)

    抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创 ...

  10. 六个创建模式之抽象工厂模式(Abstract Factory Pattern)

    问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...

随机推荐

  1. Oracle 12.2报错ORA-15032、ORA-15410或ORA-15411解决

    现象:在Oracle 12.2.0.1 RAC环境,在其ASM实例中,如果添加不同大小或者不同数量的LUN到failgroup中,会报错: ORA-15032: not all alterations ...

  2. JAVA String中文乱码

    System.out.println(str); String str1 = new String(str.getBytes("ISO-8859-1"), "utf-8& ...

  3. 软件测试之Soot

    详情请见:https://github.com/fogmisty/SoftwareTest  

  4. SQL的优化整理

    1,对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建索引 (注意:如果一张数据表中的数据更新频率太高,更新数据之后需要重新创索引,这个过程很耗费性能,所以更新频率高的数据表慎用 ...

  5. Python实现图像边缘检测算法

    title: "Python实现图像边缘检测算法" date: 2018-06-12T17:06:53+08:00 tags: ["图形学"] categori ...

  6. JavaScript之基础语法整理

    1.数据类型(number,boolean,string,null,undefined,symbol,object) es是动态语言,弱类型语言,虽然先声明了变量,但是变量可以重新赋值任意类型 弱类型 ...

  7. JS根据屏幕分辨率改变背景宽高

    //控制浏览器显示的高宽 function document_loaded() { GotoMainStep(); /; document.getElementById("main1&quo ...

  8. git 使用过程中遇到的问题does not appear to be a git repository Could not read from remote respository

    想把本地的git库上传到github上.github已经新建了一个public仓库,利用网站的命令 git Bash报错:does not appear to be a git repository  ...

  9. ASP.NET CORE做的网站运行在docker实践

    用VS2017 建立了 DotNet Core 2.2 的网站后,如何转移到 Docker 下运行? 下面分两种方式来实践: 1.直接手动命今行,将本机目录映射进Docker,运行网站.2.制作 Im ...

  10. SlidingMenu第二篇 --- SlidingMenu常用属性介绍

    /** * 设置滑动的屏幕范围 * 1. TOUCHMODE_MARGIN 设置为全屏边缘可滑动 * 2. TOUCHMODE_FULLSCREEN 设置为全屏区域都可以滑动 * 3. TOUCHMO ...