设计模式——抽象工厂模式及java实现
设计模式——抽象工厂模式及java实现
设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能。
设计模式有很多,而且也随着时间在不断增多,其中最著名的是四人组写的23种设计模式,并分为三大类:创建型模式,结构型模式,行为型模式。
抽象工厂模式属于创建型模式里面的五种之一,其中的工厂模式由于违背开闭原则(也就是对扩展开发,对修改关闭),所以抽象工厂模式可以有效解决
这里先给出java的抽象工厂模式的示例代码:
//抽象的人类,为所有的人造人提供一个相同的人造人属性
public abstract class Man {
public abstract void eat();
}
public class AsiaMan extends Man {
@Override
public void eat() {
System.out.println("亚洲人用筷子吃");
}
}
public class AmericanSuperMan extends Man {
@Override
public void eat() {
System.out.println("美国人用刀叉吃");
}
}
//抽象工厂,为所有的不同的工厂提供一个制作人造人的相同方法
public abstract class Factory {
public abstract Man product();
}
public class AsiaManFactory extends Factory {
@Override
public Man product() {
Man anAisaMan = new AsiaMan();
return anAisaMan;
}
}
public class AmericanFactory extends Factory {
@Override
public Man product() {
AmericanSuperMan anAmericanSuperMan = new AmericanSuperMan();
return anAmericanSuperMan;
}
}
public static void main(String[] args) {
AsiaManFactory asiaManFactory = new AsiaManFactory();
AmericanFactory americanFactory = new AmericanFactory();
Man anAmericanSuperMan = americanFactory.product();
Man anAsia = asiaManFactory.product();
anAsia.eat();
anAmericanSuperMan.eat();
}
运行结果:
亚洲人用筷子吃
美国人用刀叉吃
假设2048年,人类科技创造了人造人,所有的人造人可以在工厂里面生产,
一个人造人父类为所有不同的人造人提供一个相同的属性:吃,亚洲人造人用筷子吃,美洲人造人用刀叉吃。抽象工厂可以为不同的工厂提供一个统一的生成流程,亚洲人造人工厂生产亚洲人造人,美洲人造人工厂生产美洲人造人
这里就有一个问题,为什么要用工厂模式,为什么不直接用 ClassA a = new ClassA();呢?看起来是等价的,但是如果生产的人造人不是在工厂里生产的,而是分布在世界各地的小作坊生产的,那么当所有亚洲人造人生产方式变了,那么就要更改世界各地的小作坊的生产方法,这样改下来就太麻烦了,用了工厂模式,只需要修改工厂里面的生产方法,那么得到的人造人就是统一的了。
其实工厂模式就是对示例化过程的一个封装,为日后维护代码提供一个便捷的方法
设计模式——抽象工厂模式及java实现的更多相关文章
- 抽象工厂模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操 ...
- 5. 星际争霸之php设计模式--抽象工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- Java设计模式-抽象工厂模式(Abstract Factory )
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- 2.java设计模式-抽象工厂模式
抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一 ...
- Java设计模式-抽象工厂模式(Abstarct Factory)
抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...
- Java设计模式——抽象工厂模式
抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...
- 24种设计模式--抽象工厂模式【Abstract Factory Pattern】
女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...
- 设计模式 | 抽象工厂模式(abstract factory)
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...
随机推荐
- BPM配置故事之案例8-根据表单数据调整审批线路
Boss突然来到:小明啊,咱们的物资申请金额现在既然可以确定了,以后金额在1万以下的申请单,就不用我审批了.直接通过就行了. 小明:好的 然后小明把流程线路改成了这样. 线路条件1 线路条件2
- Autodesk 360 Mobile不能显示图片?
在6月21号的DevLab上,有一位朋友说Autodesk 360 Mobile在iPad上不能显示JPG图片预览.我当时没带iPad,不能测试.后天回家在Autodesk 360 Mobile 3. ...
- Day Tips:ForceDeleteSite
最近遇到一个奇怪的问题,如下图: 试了各种删除方式都不行. 谷歌了一下发现需要使用如下代码删除. SPWebApplication w = SPWebApplication.L ...
- 论使用LeanCloud中遇到的坑
1.短信验证码 当注册用户的时候,会发现收不到短信验证码,打印e : That operation isn't allowed for clients. 含义 - 该操作无法从客户端发起.请检查该错误 ...
- xcode7无证书真机调试 Error: An App ID with identifier "*" is not avaliable. Please enter a different string.
1. Error: An App ID with identifier "*" is not avaliable. Please enter a different string. ...
- Android中将xml布局文件转化为View树的过程分析(上)
有好几周没写东西了,一方面是因为前几个周末都有些事情,另外也是因为没能找到好的写作方向,或者说有些话题 值得分享.写作,可是自己积累还不够,没办法只好闷头继续研究了.这段时间一边在写代码,一边也在想A ...
- 2.3 CMMI2级——项目跟踪和控制(Project Monitoring and Control)
计划不是用来看的,是用来执行的.PP讲述了如何做计划,PMC讲述的就是如何跟踪计划的执行并在实际情况偏离计划时采取纠正行动. 我们先看看SG1,SG1讲述的是如何根据计划来跟踪计划的执行问题. SG1 ...
- jQuery加载一个html页面到指定的div里
一.jQuery加载一个html页面到指定的div里 把a.html里面的某一部份的内容加载到b.html的一个div里.比如:加载a.html里面的<div id=“row"> ...
- 关于学习javascript的一些建议
有被朋友或同事问到过,要如何学习前端技术,他们大多是已经掌握其他语言的程序员,或是计算机相关专业的在校生. 每次被问到,总要组织回忆一番,本着DRY原则,我还是根据我学习javascript(下文都简 ...
- input 默认值为灰色,输入时清楚默认值
input 默认值为灰色,输入时清楚默认值 <input value="please input your name" onFocus="if(value==def ...