文档章节

设计模式:抽象工厂模式

大羌
 大羌
发布于 2017/09/10 23:16
字数 556
阅读 2
收藏 0
点赞 0
评论 0

定义:为创建一组相关或者相互依赖的对象提供一组接口,而无需指定它们的具体类;

工厂的最终定义是:客户提出需求,工厂满足需求,客户不需要知道你到底是怎么是实现的,给结果就行;

工厂方法模式在一般情况下只是会产生一个factory,因为在他的范畴内,产品类基本上只会出现一种差异(或者说是方法,特性差异并不多),东南亚分为:Malaysia,Thailand,Singepore;但是其中并没有考虑到其中各个国家内部之间还有差异;比如Malaysia;内部语言可能会有马语,和英语,在工厂方法模式中并不能很好的做出处理;那么抽象工厂模式就能够对他做出处理;

以上面国家为例写个demo:

A:抽象的产品类:

public interface Country {
    public String countryName();
}
public abstract class AbstractCountry implements Country {
    public abstract  void useLanguage();
}

B:以马来西亚为例:

(1)使用英语的马来西亚人:

public class MalaysiaInEnglish extends AbstractCountry {
    @Override
    public void useLanguage() {
        System.out.println("use english!");
    }
    @Override
    public String countryName() {
        return "Malaysia";
    }
}

(2)使用马来语的马来西亚人:

public class MalaysiaInMaYu extends AbstractCountry {
    @Override
    public void useLanguage() {
        System.out.println("use Mayu!");
    }
    @Override
    public String countryName() {
        return "Malaysia";
    }
}

C:抽象的创造类,用于创造对象:

public abstract class AbstractCreator {

    public abstract AbstractCountry createMalaysia();
}

(1)生产说英语的马来西亚

public class EnglishMalaysiaCreator extends  AbstractCreator {
    @Override
    public AbstractCountry createMalaysia() {
        return new MalaysiaInEnglish();
    }
}

(2)生产说马语的马来西亚

public class MayuMalaysiaCreator extends  AbstractCreator {
    @Override
    public AbstractCountry createMalaysia() {
        return new MalaysiaInMaYu();
    }
}

D:实现测试:

public class PatternRealize {
    public static void main(String[] args) {
        AbstractCreator c1= new EnglishMalaysiaCreator();
        AbstractCreator c2 = new MayuMalaysiaCreator();

        MalaysiaInEnglish english  = (MalaysiaInEnglish) c1.createMalaysia();
        MalaysiaInMaYu mayu = (MalaysiaInMaYu) c2.createMalaysia();
    }
}

以上就是抽象工厂模式的实现;

优点:

封装性:只需要提需求,怎么出现的不管;

产品族内的约束为非公开状态:比如人的说英语和马语的人数分配;不公开,内部自己就定义好了;(其实也是因为封装的缘故);

缺点:

抽象类比较多,当增加产品族的时候,需要多一个create;而且要改抽象接口里面的代码不太符合设计模式中的开闭原则;

© 著作权归作者所有

共有 人打赏支持
大羌
粉丝 0
博文 29
码字总数 13024
作品 0
成都
程序员

暂无相关文章

sbt网络问题解决方案

http://dblab.xmu.edu.cn/blog/maven-network-problem/

狐狸老侠 ⋅ 8分钟前 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 51分钟前 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 57分钟前 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部