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 ...
随机推荐
- CF809E 【Surprise me!】
我们要求的柿子是张这样子的: \[\frac{1}{n * (n - 1)} * \sum_{i = 1}^n\sum_{j = 1}^{n}\phi(a_i*a_j)*dis(i, j)\] 其中\ ...
- 【转】harbor仓库高可用集群部署说明
之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...
- P3239 [HNOI2015]亚瑟王——概率DP
题面:亚瑟王 最近考试考期望很自闭啊,没做过这种类型的题,只能现在练一练: 所谓期望,就是状态乘上自己的概率:对于这道题来说,我们要求的是每张牌的伤害乘上打出的概率的和: 当然不是直接乘,因为给的是每 ...
- 2018-2019-2 20165209 《网络对抗技术》Exp9: Web安全基础
2018-2019-2 20165209 <网络对抗技术>Exp9: Web安全基础 1 基础问题回答和实验内容 1.1基础问题回答 (1)SQL注入攻击原理,如何防御? 原理:SQL注入 ...
- [Andorid] 通过JNI实现kernel与app进行spi通讯
CPU:RK3399 系统:Android 7.1 人脸识别的要求越来越高,因此主板增加了 SE 加密芯片,加密芯片通过 spi 接口与 CPU 通讯. 对于 kernel 层的代码,Linux 原始 ...
- Python 自学笔记(八)
import math def A(a,b): print("第一个参数的值为"+str(a)) print("第一个参数的值为"+str(b)) a = 1 ...
- MATLAB中图像的基本操作
MATLAB中图像的基本操作 1.读取.显示图片 MATLAB中提供了immread()与imshow()函数读取和显示图片.其中读取函数imread()原型: imread: A = imread( ...
- latex运算符
一些小的运算符,可以在数学模式下直接输入,但是有一些运算符需要用控制序列生成:
- angular绑定数据
Angular 中使用{{}}绑定业务逻辑里面定义的数据 <h1> Welcome to {{ title }}! /*引入title*/ </h1> export class ...
- Bitmap之getDensity和setDensity函数
package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...