文档章节

设计模式:抽象工厂模式

大羌
 大羌
发布于 2017/09/10 23:16
字数 556
阅读 2
收藏 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
博文 30
码字总数 13657
作品 0
成都
程序员
私信 提问

暂无文章

线下工坊|Blockchain Coding Day:零基础教你开发DAPP(北京)

我们的目标是通过编程学习让你更了解区块链技术。这将对区块链开发初学者一次很好的体验。这里需要强调一下,编程零基础也能学会。 我们将以小组的形式,由教练带领学员完成DAPP开发。每位学...

HiBlock
36分钟前
2
0
查看内存情况

jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。...

Canaan_
37分钟前
2
0
基于对象特征的推荐

(本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 在上一期基于协同过滤的的推荐场景中,我们介绍了如何通过PAI快速搭建一个基于协同过滤方案的推荐系统,这一节会介绍一些如何基...

阿里云官方博客
45分钟前
2
0
Ugly Number(leetcode263)

Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. Example 1: Input: 6Output: true......

woshixin
今天
2
0
深度模型从研者 眼里的 似然估计 & Hessain 海森矩阵 & Fisher Information (费雪信息)

深度模型的训练的基本依据是最小化模型拟合数据的误差。旨在不仅知其然(如何构建和训练一个深度模型),还应知其所以然(为什么这样训练,可以做哪些优化)。我们就会发现,有很多研究者,在...

刘小米_思聪
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部