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设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
随机推荐
- exec与match方法的区别
http://www.cnblogs.com/xiehuiqi220/archive/2008/11/05/1327487.html var someText= "web2.0 .net2. ...
- truncate table时存在外键约束的解决办法
以前在使用truncate命令时遇到表存在外键引用时无法执行命令的情况都是用delete来代替,今天又遇到这个问题,于是在网上搜了一把,可以通过如下方式解决: 1.基本思路:先关闭mysql的外键约束 ...
- 如何使用VisualSVN Server建立版本库
首先打开VisualSVN Server Manager,如图: 可以在窗口的右边看到版本库的一些信息,比如状态,日志,用户认证,版本库等.要建立版本库,需要右键单击左边窗口的Repositores, ...
- win(64位)环境下oracle11g的安装方法
将压缩文件解压到一个目录中,该目录结构如下: 安装步骤(摘自网络): 1.进入数据库解压目录,双击其中的“setup.exe”文件,稍等片刻出现如下“配置安全更新“界面,取消“我希望通过My Orac ...
- Vue2 异步获取的数据(通过ajax)获取的数据 渲染到dom上
页面dom结构如下 <ul class="user" id="app"> <li><span>姓名: </span&g ...
- Install zeal on ubuntu16.04
Dash is a helpful software for macOS users. For Windows and Linux users, zeal is the open-source cou ...
- Java基础知识➣泛型整理(四)
概述 泛型的本质是参数化类型,使用同一套代码来满足不同数据类型的业务需要,提高代码的执行效率,使代码简单明了. 泛型方法 该方法在调用时可以接收不同类型的参数.根据传递给泛型方法的参数类型,编译器适当 ...
- cqoi2018
题解: 很多模板题 第一次写莫队还比较顺利 除了把排序的cmp写错..(还第一次遇到) 这题分块也可以 先预处理出g[i][j]代表前i个块,颜色为j的有多少种 f[i][j]表示i-j的块能构成多少 ...
- C# 之 反射性能优化2
问题回顾 在上篇博客中,我介绍了优化反射的第一个步骤:用委托调用代替直接反射调用. 然而,那只是反射优化过程的开始,因为新的问题出现了:如何保存大量的委托? 如果我们将委托保存在字典集合中,会发现这种 ...
- Telnet和SSH
1. 协议用途 Telnet和SSH用于远程访问服务器的的两大常用协议.利用它们,我们可以管理并监控生产服务器和企业服务器,更新服务器内核,安装最新的软件包和补丁,能够远程登录服务器,开展软件开发.测 ...