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设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
随机推荐
- Logcat命令详情
logcat是什么? Logcat 是一个命令行工具,用于转储系统消息日志,其中包括设备引发错误时的堆叠追踪以及从您的应用使用 Log类编写的消息. 格式:[adb] logcat [<opti ...
- vue.js 入门学习
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- matalb 产生信号源 AM调制解调 FM调制解调
%%%%%%%%%%%%%%%%%%%%%%%%%%% %AM调制解调系统 %%%%%%%%%%%%%%%%%%%%%%%%%%% clear; clf; close all Fs=800000;%采 ...
- 【python】python为何多线程无法切换
写了一个kafka传输消息,celery发布任务的脚本. 有四个线程,分别读取不同的kafka队列信息 问题是,只有第一个线程会启动,剩下的三个线程连start都运行不了. 而且这个问题不是一开始就发 ...
- 【sqli-labs】Less11~Less16
学习sqli-labs的笔记,前面的笔记内容比较详细.后面的只记录关键点了. Less11: POST注入, 有回显,有错误提示 从11题起是POST注入,发现有两个输入框.用firefox的F12查 ...
- Java中Super和final关键字以及异常类
1.final类不能有子类,也就谈不上继承的说法,如果用final修饰成员变量或者局部变量,那成了常量需要制定常量的值. 2.对象的上转型对象,上转型对象不能操作子类新增的成员变量,不能调用子类新增的 ...
- PyCharm设置字体风格
设置字体风格:File—Setting—Editor-Color Scheme-Color Scheme Font-把Scheme设置为:WarmNeon
- python发送邮件(在邮件中显示HTMLTestRunner生成的报告)
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart f ...
- 备份还原数据数据库(固定IP版)
1.新建data文件夹,用于存放备份数据 2.新建db文件夹,用于存放初建数据库为脚本 3.首次使用双击export.bat进行备份数据库: 4.以后每次使用双击setup.bat进行还原数据库: 备 ...
- Android取得系统时间
Time t = new Time();//实例化Time类 t.setToNow();//取得当前的系统时间 int month = t.month;//获取月 int year = t.year; ...