java23种设计模式之九: 抽象工厂方法模式
一.抽象工厂定义
上一讲我们说了一下工厂方法,那么我们如何对工厂进行抽象。
因为工厂是生产产品的,现在我们需要工厂抽象,只生产抽象产品,不生产具体的产品,这同时也体现了java的多态。
现在有2个抽象,一个是抽象工厂,另一个是抽象产品。
下面介绍抽象产品到具体产品:
产品的具体实现可以有多种方式,可以有抽象类去实现抽象产品中共有的方法,另一部分交给子类实现,这样,我们就可以把产品一些公有的属性抽象出来,一些
特有的属性由子类根据自身条件实现,这样就可以有同种功能,不同型号的产品。
下面介绍抽象工厂到具体工厂:
抽象工厂是生产产品的,生产具体哪一款产品我们不得而知,但是我们可以通过前面的具体的产品来判断,生产同种类型的产品地方只能是具体类型工厂了,比如
小米手机工厂只能生产小米手机,苹果手机工厂只生产苹果手机,这样我们就可以有具体的工厂了。下面看2个类型的示例:
//接口
interface Phone{
//打电话
void call();
//发短信
void sendMsg();
//品牌
void brand();
}
//抽象类,只实现部分功能
abstract class AbstractPhone implements Phone{ @Override
public void call() {
System.out.println("手机在打电话...");
}
@Override
public void sendMsg() {
System.out.println("手机在发信息...");
}
}
//具体实现类1:苹果手机
class ApplePhone extends AbstractPhone{ @Override
public void brand() {
System.out.println("苹果手机");
this.call();
this.sendMsg();
} }
//具体实现类2:小米手机
class XiaoMiPhone extends AbstractPhone{ @Override
public void brand() {
System.out.println("小米手机");
this.call();
this.sendMsg();
} }
//抽象工厂:生产手机
interface PhoneFactory{
Phone createPhone();
}
//具体工厂1:生产苹果手机
class ApplePhoneFactory implements PhoneFactory{ @Override
public Phone createPhone() {
return new ApplePhone();
}
}
//具体工厂2:生产小米手机
class XiaoMiFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new XiaoMiPhone();
}
}
//接口
interface Human{
void getColor();
void talk();
void getSex();
}
//抽象类,只实现部分功能
abstract class AbstractYellowHuman implements Human{
@Override
public void getColor() {
System.out.println("yellow color...");
} @Override
public void talk() {
System.out.println("yellow talk...");
}
}
//具体实现类1:具体实现类会完成父类接口中未完成的方法
class MaleYellowMan extends AbstractYellowHuman{
@Override
public void getSex() {
System.out.println("yellow...male");
}
}
//具体实现类2:具体实现类会完成父类接口中未完成的方法
class FemaleYellowMan extends AbstractYellowHuman{ @Override
public void getSex() {
System.out.println("yellow...female");
}
}
//抽象工厂
interface HumanFactory{
Human createYelloHuman();
} //具体工厂1:创建男性的工厂
class MaleFactory implements HumanFactory{
@Override
public Human createYelloHuman() {
return new MaleYellowMan(); //创建黄种人,男性角色
}
} //具体工厂2:创建女性的工厂
class FemaleFactory implements HumanFactory{
@Override
public Human createYelloHuman() {
return new FemaleYellowMan();
}
}
java23种设计模式之九: 抽象工厂方法模式的更多相关文章
- java23种设计模式(一)工厂方法模式
在说工厂方法模式之前,先了解一下简单工厂模式.工厂方法模式其实是在简单工厂上面做了一些增强. 简单工厂模式:有一个专门的类来生产其他类的实例,生产的这些实例有一个共同父类.这个跟我们的多态有一点像. ...
- Android设计模式——抽象工厂方法模式
1.抽象工厂方法模式:为了创建一组或相互依赖的对象提供一个接口,而不需要指定它们是具体类……无语 2.找个代码看看: 抽象工厂类<成员为接口> /** * 抽象工厂 * */ public ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- java23种设计模式(一)-- 工厂模式、抽象工厂模式和单例模式
一.工厂模式 1.定义统一的接口,并在接口中定义要实现的抽象方法. 2.创建接口的具体实现类,并实现抽象方法. 3.创建一个工厂类,根据传递的参数,生成具体的实现类对象,执行具体的方法. 优点: 1. ...
- 设计模式C#实现(九)——工厂方法模式和简单工厂
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 构成: 1.Product工厂方法创建的对象的接口 2.Concrete ...
- Java设计模式从精通到入门五 抽象工厂方法模式
定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- 【python设计模式-创建型】工厂方法模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...
- 设计模式C#合集--工厂方法模式
简单工厂,代码: public interface ISpeak { public void Say(); } public class Hello : ISpeak { public void Sa ...
随机推荐
- 7、transformation和action2
一.transformation开发实战 1.map: 将集合中每个元素乘以2 使用map算子,将集合中的每个元素都乘以2 map算子,是对任何类型的RDD,都可以调用的,在Java中,map算子接收 ...
- 牛客OI周赛10-提高组:B-Taeyeon的困惑(值域线段树)
做法 单点加单点删,在值域线段树上直接二分就能求值前\(K\)小的和 Code #include<bits/stdc++.h> typedef long long LL; const LL ...
- nodeJs 初学案例摘要
在学习nodeJs的时候,照着文档做的,但是到最后的上传文件显示图片总是报错, 所用的fs.renameSync出错:Error: EXDEV, cross-device link not permi ...
- ibm 汇编
https://www.ibm.com/developerworks/cn/linux/l-assembly/index.html https://72k.us/file/4031001-328073 ...
- GitLab安装及备份迁移数据
centos7安装GitLab 下载相应版本rpm包 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 我此处下载9.3.6版本. # w ...
- selenium反爬机制
使用selenium模拟浏览器进行数据抓取无疑是当下最通用的数据采集方案,它通吃各种数据加载方式,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制.它的应用,使得许多网站的反采集策略形同虚设.由于se ...
- 2018-2019-2 20165234 《网络对抗技术》 Exp8 网络欺诈防范 Web基础
Exp8 网络欺诈防范 Web基础 一. 实践内容 1. Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. 2. Web ...
- opencv常见示例
1.批量转换灰度图并保存 #include <iostream> #include <opencv2/opencv.hpp> #include <string> u ...
- JDK&JRE
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE.所以安装了JDK,就不用在单独安装JRE了. 其中的开发工具:编译工具(javac.exe) 打包工具(jar.ex ...
- 【分类算法】朴素贝叶斯(Naive Bayes)
0 - 算法 给定如下数据集 $$T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},$$ 假设$X$有$J$维特征,且各维特征是独立分布的,$Y$有$K$种取值.则 ...