Java设计模式从精通到入门五 抽象工厂方法模式
定义
抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类。
这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。这里强调一下,工厂方法包括:简单工厂模式,和工厂方法模式等一些系列的工厂方法模式的变形。
案例
现在有两个产品,一个是手机,一个是电脑。手机和电脑都是不同的生产商生产的。我们要实现一个工厂管理系统,记录华为和苹果着两家工厂生产的手机和电脑信息。
已知,华为和苹果都有自己的工厂,华为的叫做华为工厂,苹果的叫做苹果工厂。华为工厂生产华为手机和华为电脑。苹果工厂生产苹果手机和苹果电脑。用抽象工厂模式实现改系统,他的设计图如 图一:
图一
代码如下
Factory类:
/**
* @InterfaceName Factory
* @Description 抽象工厂
* @Author ouyangkang
* @Date 2019-01-19 11:25
**/
public interface Factory {
/**
* @Author ouyangkang
* @Description 生产手机
* @Date 11:25 2019/1/19
* @param
* @return com.设计模式.factory.abstractfactory.Phone
**/
Phone createPhone();
/**
* @Author ouyangkang
* @Description 生产电脑
* @Date 11:26 2019/1/19
* @param
* @return com.设计模式.factory.abstractfactory.Computer
**/
Computer createComputer();
}
IphoneFactory类
/**
* @ClassName IphoneFactory
* @Description 苹果厂商之生产苹果的产品
* @Author ouyangkang
* @Date 2019-01-19 11:36
**/
public class IphoneFactory implements Factory{
@Override
public Phone createPhone() {
return new Iphone();
}
@Override
public Computer createComputer() {
return new IphoneComputer();
}
}
HuaWeiFactory类
/**
* @ClassName HuaWeiFactory
* @Description TODO
* @Author ouyangkang
* @Date 2019-01-19 11:37
**/
public class HuaWeiFactory implements Factory {
@Override
public Phone createPhone() {
return new HuaWeiIphone();
}
@Override
public Computer createComputer() {
return new HuaWeiComputer();
}
}
Phone类
/**
* @InterfaceName Phone
* @Description 手机接口
* @Author ouyangkang
* @Date 2019-01-19 11:21
**/
public interface Phone {
/**
* @Author ouyangkang
* @Description 手机生产商
* @Date 11:23 2019/1/19
* @param
* @return void
**/
void name();
/**
* @Author ouyangkang
* @Description 通信功能
* @Date 11:22 2019/1/19
* @param
* @return void
**/
void communication();
}
Iphone类
/**
* @ClassName Iphone
* @Description TODO
* @Author ouyangkang
* @Date 2019-01-19 11:27
**/
public class Iphone implements Phone {
@Override
public void name() {
System.out.println("苹果手机");
}
@Override
public void communication() {
System.out.println("用苹果手机进行通信");
}
}
HuaWeiPhone类
/**
* @ClassName HuaWeiPhone
* @Description TODO
* @Author ouyangkang
* @Date 2019-01-19 11:33
**/
public class HuaWeiPhone implements Phone {
@Override
public void name() {
System.out.println("华为手机");
}
@Override
public void communication() {
System.out.println("用华为手机进行通信");
}
}
Computer类
/**
* @InterfaceName Computer
* @Description 电脑
* @Author ouyangkang
* @Date 2019-01-19 11:23
**/
public interface Computer {
/**
* @Author ouyangkang
* @Description 电脑生产商
* @Date 11:24 2019/1/19
* @param
* @return void
**/
void name();
/**
* @Author ouyangkang
* @Description 上网
* @Date 11:24 2019/1/19
* @param
* @return void
**/
void surf();
}
HuaWeiComputer类和IPhoneComputer类和上面HuaWeiIphone和Iphone类似代码就不重复了。
Client类
public class Client {
public static void main(String[] args) {
//苹果厂商
Factory iphoneFactory = new IphoneFactory();
Computer iphoneFactoryComputer = iphoneFactory.createComputer();
iphoneFactoryComputer.name();
iphoneFactoryComputer.surf();
System.out.println("--------------------------");
Phone phone = iphoneFactory.createPhone();
phone.name();
phone.communication();
System.out.println("--------------------------");
// 华为厂商
Factory huaWeiFactory = new HuaWeiFactory();
Computer huaWeiFactoryComputer = huaWeiFactory.createComputer();
huaWeiFactoryComputer.surf();
huaWeiFactoryComputer.name();
System.out.println("--------------------------");
Phone huaWeiPhone = huaWeiFactory.createPhone();
huaWeiPhone.communication();
huaWeiPhone.name();
}
}
运行得到结果
苹果电脑
用苹果电脑上网
--------------------------
苹果手机
用苹果手机进行通信
--------------------------
用华为电脑上网
华为电脑
--------------------------
用华为手机进行通信
华为手机
总结
上面得简单UML类图我用Visual Paradigm 15.2划了好久,想起了学校外教教我们画这个得时候,后悔当初学得不好,现在只能自己慢慢摸索。
抽象工厂从定义上是很好理解的,为创建一组相关得或者相互依赖得对象提供一个接口,无需指定一个具体得类。一开始自己对于抽象工厂和工厂方法模式总是混淆,但是如果咬文嚼字得看这个两个设计模式得定义得话,然后看代码还是很好区别得。如果你看到一个Factory只有定义一个实例化子类得接口,那么你就可以认为它是工厂方法模式,如果你看到一个Factory中定义了多个实例化子类的不同接口的话,那么他就是抽象工厂方法。
Java设计模式从精通到入门五 抽象工厂方法模式的更多相关文章
- Android设计模式——抽象工厂方法模式
1.抽象工厂方法模式:为了创建一组或相互依赖的对象提供一个接口,而不需要指定它们是具体类……无语 2.找个代码看看: 抽象工厂类<成员为接口> /** * 抽象工厂 * */ public ...
- Java设计模式从精通到入门四 工厂方法模式
工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...
- java23种设计模式之九: 抽象工厂方法模式
一.抽象工厂定义 上一讲我们说了一下工厂方法,那么我们如何对工厂进行抽象. 因为工厂是生产产品的,现在我们需要工厂抽象,只生产抽象产品,不生产具体的产品,这同时也体现了java的多态. 现在有2个抽象 ...
- 抽象工厂方法模式(Abstract Factory Pattern)
Provide an interface for creating families of related or dependent objects without specifying their ...
- Java设计模式从精通到入门一 责任链模式
一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...
- Java设计模式从精通到入门二 装饰器模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构. 应用实例: 给英雄联盟种的射手,添加不同的装备.先装备攻速 ...
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
随机推荐
- kernel_size
kernel_size=(1,3)[flag] if flag==True:kernel_size=3 else: kernel_size=1
- nginx实践(五)之代理服务(正向代理与反向代理介绍)
正向代理 正向代理代理是为客户端服务,代理负责DNS解析域名到对应ip,并进行访问服务端,返回响应给客户端 反向代理 客户端自己负责请求DNS解析域名到对应ip,服务端通过代理分发流量,进行负载均衡 ...
- ignitius and princess 2(全排列)
A - Ignatius and the Princess II Now our hero finds the door to the BEelzebub feng5166. He opens the ...
- 20165314 2017-2018-2《Java程序设计》课程总结
20165314 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:C语言基础调查和java学习展望 预备作业3:Linux安 ...
- 关于使用easyui为前端框架,加载表格数据较多时在火狐浏览器会出现表格片段不停闪烁问题的兼容问题解决。
1.项目是可视化管理系统,加载的数据较多,使用谷歌浏览器从登陆界面跳转到主页时还算干净利落,但是使用火狐浏览器时在这一过程中在数据没有加载完毕之前,整个页面就仿佛是在闪烁,可以看到闪烁的是表格字段的片 ...
- js 压缩上传的图片方法(默认上传的是file文件)
//压缩图片方法 function compressImg(file,callback){ var src; var fileSize = parseFloat(parseInt(file['size ...
- git如何创建 .gitignore文件
1.右键 点击git bash here 2.输入 touch .gitignore 生成 .gitignore文件 过滤 不上传 node_modules/
- new/new[]和delete/delete[]是如何分配空间以及释放空间的
C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为或堆(heap).程序可以用堆来存储动态分配的对象,即那些在程序运行时创建的对象.动态对象的生存期由程序来控制 ,当动 ...
- Git的常见基础操作命令
Git的常见基础操作命令 1安装初始化 1.1安装git本地安装Windows版本 下载地址: https://git-scm.com/downloads/ 1.2初始化Git用户信息配置 配置git ...
- 一脸懵逼学习Hive的安装(将sql语句翻译成MapReduce程序的一个工具)
Hive只在一个节点上安装即可: 1.上传tar包:这个上传就不贴图了,贴一下上传后的,看一下虚拟机吧: 2.解压操作: [root@slaver3 hadoop]# tar -zxvf hive-0 ...