设计模式二十四章经之抽象工厂模式
时间:2022-06-01
本文章向大家介绍设计模式二十四章经之抽象工厂模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述
前面我们已经说到了工厂模式,现在我们扯扯抽象工厂模式。从字母意思理解下,工厂也就是会生产指定的产品。那么抽象工厂就意味着生产出来的产品不是指定的。往简单点说,抽象工厂就是为创建一组相关或者相互依赖的对象提供一个接口,而不需要指明他们的具体类。
使用场景
一个产品族有相同的约束时可以使用抽象工厂模式。是不是听起来很抽象?比如android、ios下都有短信软件和拨号软件,两者同属于软件。但是,他们所在的系统不一样,即使是同一家公司出品的软件,代码实现也是不一样的。这个时候就可以考虑使用抽象工厂模式来产生这些软件。
具体实现
首先,我们创建一个实体类的接口:
public interface Shape {
void draw();
}
现在我们创建2个实体类去实现这个接口:
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square:draw() method.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle:draw() method.");
}
}
我们在创建一个实体类的接口:
public interface Color{
void fill();
}
我们继续创建2个实体类去实现这个接口:
public class RedColor implements Color{
@Override
public void fill(){
System.out.println("Color:Red");
}
}
public class BlueColor implements Color{
@Override
public void fill(){
System.out.println("Color:Blue");
}
}
现在我们创建一个工厂类:
public abstract class Factory{
public abstract Shape createShape();
public abstract Color createColor();
}
接着我们创建2个工厂去实现这个工厂类:
public class RedSquareFactory extends Factory{
@Override
public Shape createShape(){
return new Square();
}
@Override
public Color createColor(){
return new RedColor();
}
}
public class BlueCircleFactory extends Factory{
@Override
public Shape createShape(){
return new Circle();
}
@Override
public Color createColor(){
return new BlueColor();
}
}
最后我们来写个demo:
public class Demo{
public static void main(String[] args){
Factory redSquareFactory=new RedSquareFactory();
redSquareFactory.createShape().draw();
redSquareFactory.createColor().fill();
Factory blueCircleFactory=new BlueCircleFactory();
blueCircleFactory.createShape().draw();
blueCircleFactory.createColor().fill();
}
}
输出结果如下:
Square:draw() method.
Color:Red
Circle:draw() method.
Color:Blue
总结
优点:
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
- 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
- OutOfMemoryError异常系列之Java堆溢出
- android ndk之hello world
- ScheduledExecutorService和timer的异同
- 【精心解读】关于Jupyter Notebook的28个技巧
- Web项目接口自动化测试框架搭建
- 一文读懂Hadoop、HBase、Hive、Spark分布式系统架构
- 《Spring敲门砖之基础教程第一季》 第二章(1) Spring框架之IOC首例-HelloWorld
- Java9中的GC调优基础
- javascript深入理解js闭包
- https连接的前几毫秒发生了什么
- android自定义view实现progressbar的效果
- 还是不靠谱!多维LSTM网络预测比特币价格【机器学习应用区块链系列二】
- picasso图片缓存框架
- Git基础和规范-协同开发
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法