设计模式(2)--抽象工厂模式
来源:互联网 发布:迷你led显示屏软件 编辑:程序博客网 时间:2024/06/05 00:25
上一篇工厂方法模式,一个工厂只生产一种产品,比如电池工厂只生产电池不生产别的,摄像头工厂只生产摄像头,不生产别的。
而抽象工厂模式,生产一系列产品,比如:苹果手机工厂,生产苹果电池、苹果屏幕、苹果摄像头等有相同共同点的产品。
也就是说,我们如果需要某个功能,这个功能按照类别不同,他的属性也就不同,比如:报告生成系统,可以生成pdf格式和word格式两种报告格式,如果是需要生成pdf类型报告,就会生成pdf格式的A报告和B报告,如果需要生成word类型报告,就会生成doc格式的A报告和B报告。这里工厂就分为pdf工厂和doc工厂,两个工厂各负责一类具有共同点产品的产出。
抽象工厂模式比工厂方法模式更加抽象,所以他也更加具有一般性。
抽象工厂模式UML类图如图:
手残党在此
代码示例说明:
有Apple手机工厂和Android手机工厂,生产Apple手机屏幕、电池和Android手机屏幕、电池。
实例代码:
抽象产品工厂
public abstract class AbstractProductFactory {public abstract AbstractProductDianchi getProductDianchi();public abstract AbstractProductPingmu getProductPingmu();}
工厂工厂,里面的方法当然是生产产品,生产产品先定下来,至于产品的类被,交给具体工厂确定。
苹果工厂
/***** * 苹果手机工厂 * @author wjw * */public class ProductAppleFactory extends AbstractProductFactory{@Overridepublic AbstractProductDianchi getProductDianchi() {// TODO Auto-generated method stubreturn new AppleProductDianchi();}@Overridepublic AbstractProductPingmu getProductPingmu() {// TODO Auto-generated method stubreturn new AppleProductPingmu();}}
安卓手机工厂:
/***** * 安卓手机工厂 * @author wjw * */public class ProductAndroidFactory extends AbstractProductFactory{@Overridepublic AbstractProductDianchi getProductDianchi() {// TODO Auto-generated method stubreturn new AndroidProductDianchi();}@Overridepublic AbstractProductPingmu getProductPingmu() {// TODO Auto-generated method stubreturn new AndroidProductPingmu();}}
通过抽象工厂,我们能看出生产电池(Dianchi)和屏幕(Pingmu)两种产品,不知道具体那种产品,所以这两种产品都需要进行一下抽象。
抽象屏幕产品
public abstract class AbstractProductPingmu {public abstract void movie();}
抽象电池产品
public abstract class AbstractProductDianchi {public abstract void discharge();}
具体产品继承抽象产品:
安卓手机屏幕产品:
public class AndroidProductPingmu extends AbstractProductPingmu{@Overridepublic void movie() {// TODO Auto-generated method stubSystem.out.println("安卓屏幕看电影!");}}
安卓手机电池产品:
public class AndroidProductDianchi extends AbstractProductDianchi{@Overridepublic void discharge() {// TODO Auto-generated method stubSystem.out.println("安卓电池供电!");}}
苹果手机屏幕产品:
public class AppleProductPingmu extends AbstractProductPingmu{@Overridepublic void movie() {// TODO Auto-generated method stubSystem.out.println("苹果屏幕看电影");}}
苹果手机电池产品:
public class AppleProductDianchi extends AbstractProductDianchi{@Overridepublic void discharge() {// TODO Auto-generated method stubSystem.out.println("苹果电池供电!");}}
Main类:
public class Main {/** * @param args * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {// TODO Auto-generated method stubClass facrotyClazz = Class.forName(ReadProperties.readProperties("abstract_factory_name"));AbstractProductFactory factory = (AbstractProductFactory)facrotyClazz.newInstance(); AbstractProductDianchi dianchi =factory.getProductDianchi();AbstractProductPingmu pingmu = factory.getProductPingmu();dianchi.discharge();pingmu.movie();}}
运行结果:
苹果电池供电!
苹果屏幕看电影
说明:利用配置文件的配置,说明需要哪一类产品,安卓还是苹果,就可以一次生产一类多个产品。
抽象工厂模式说明:
与工厂方法模式的比较:抽象工厂比工厂方法复杂,复杂在哪里呢?其实,抽象工厂模式里面还有工厂方法模式的影子。比如:我们改成只生产一种产品(如只生产电池,就是只生产安卓电池和苹果电池这两种产品),那写出来的代码就和昨天的工厂方法模式大致一样了,比较UML类图也能比较出来。
所以说,工厂方法模式是抽象工厂模式的一种特殊情况,显然抽象工厂模式更具普遍性,它能达到这个目的,就是要比工厂方法模式更抽象,想达到普适性目的是要付出代价的。上帝最牛逼,但上帝只存在我们大脑里,抽象的存在。
抽象工厂模式增加产品类很容易,比如诺基亚重新崛起,建了个工厂,生产诺基亚手机的屏幕和电池,很容易,不用修改源代码,扩展类就行。但是!缺点就是如果想再加一个产品,比如,所有工厂想再生产摄像头,那就要修改源代码了。。。这就是传说中的开闭原则倾斜行
如有错误,欢迎指正
end
- 设计模式(2)------抽象工厂模式
- 设计模式(2)-抽象工厂模式
- 设计模式(2)--抽象工厂模式
- 设计模式学习(2)工厂模式,抽象工厂模式
- 设计模式-java工厂模式2(抽象工厂模式)
- 设计模式(2) - 抽象工厂
- 设计模式2-抽象工厂
- 设计模式(抽象工厂)
- 设计模式解读之 简单工厂模式&工厂方法模式&抽象工厂模式(2)
- 设计模式(2)工厂模式、工厂方法模式、抽象工厂模式
- <设计模式2>抽象工厂模式
- 设计模式(4)-抽象工厂模式
- 设计模式:抽象工厂模式(Python)
- 设计模式(JAVA)------抽象工厂模式
- 设计模式(三)---抽象工厂模式
- 抽象工厂模式---设计模式(好)
- 设计模式(3):抽象工厂模式
- 设计模式(三)--抽象工厂模式
- 欢迎使用CSDN-markdown编辑器
- Android Broadcas 广播
- Java数据传输结构设计
- 算法系列——Path Sum II
- 运行一个从GitHub上下载的vue项目的具体步骤
- 设计模式(2)--抽象工厂模式
- 制作简单的新闻客户端
- Codeforces #13C: Sequence 题解
- Python :用两个栈实现队列
- Python 中的Pandas库
- ubuntu16.04 安装有道词典
- 用弗洛伊德算法求赋权图的两点间的最短路径的长度
- 面试题-----排序算法之选择排序
- Ubuntu删除两个文件夹下同名同内容的文件V1.2