1. 简单工厂模式

1. 1 简单工厂模式的定义

简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的“消费”和生产完全分开,客户端只需要知道自己需要什么产品,如何来使用产品就可以了,具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。

1.2 简单工厂模式的构成

  • 具体的工厂角色:Factory;在工厂中可以调用方法生产出具体的某个类型的产品;
  • 抽象的产品角色:Product;在抽象产品类型中可以声明抽象接口,在具体的产品类中实现;
  • 具体的产品角色:ProductA 和ProdcutB;在具体的类中必须实现抽象类的接口,也可以实现自己的业务逻辑。

1.3 简单工厂模式的UML

1.4 代码实现

//抽象产品类
public abstract class Prodcut {//抽象产品方法public abstract sayHi();
}//继承抽象类实现产品A类
public class ProductA extends Product {//实现抽象产品方法@Overidepublic abstract sayHi(){System.out.println("Hi, I'm ProductA");}
}//继承抽象类实现产品A类
public class ProductB extends Product {//实现抽象产品方法@Overidepublic abstract sayHi(){System.out.println("Hi, I'm ProductB");}
}public class Factory {public Factory() {}//第一种写法//根据产品名称生产产品public Product createProduct(String productName) {Product product = NULL;switch(productName){case "A":product = new ProductA();//生产产品Abreak;case "B":product = new ProductB();//生产产品Bbreak;default:break;}return product;}//第二种写法//生产产品Apublic ProductA createProductA() {return new ProductA();//生产产品A}//生产产品Bpublic ProductB createProductB() {return new ProductB();//生产产品B}
}

1.5 简单工厂模式的优点与缺点:

  • 优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。
  • 缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则

--------

2. 工厂方法模式

2.1 工厂方法模式的定义

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过工厂父类定义负责创建产品的公共接口,子类负责生产具体对象。

2.2 解决的问题

解决简单工厂模式的弊端,实现父类定义公共实现接口,子类负责实现创建具体的对象,这样就可以实现增加产品类时,不需要修改工厂类,而只需要修改工厂子类。

2.3 工厂方法模式的构成

  • 抽象产品类:Product;描述具体产品的公共接口,在具体的产品类中实现
  • 具体产品类:ProductA和ProductB;具体产品类,实现抽象产品类的接口,工厂类创建对象
  • 抽象工厂类:Factory;描述具体工厂的公共接口
  • 具体工厂类:FactoryA和FactoryB;描述具体工厂类,实现创建产品类对象,实现抽象工厂类的接口

2.4 工厂方法模式的UML

2.5 代码实现

//抽象产品类
public abstract class Prodcut {//抽象产品方法public abstract sayHi();
}//继承抽象类实现产品A类
public class ProductA extends Product {//实现抽象产品方法@Overidepublic abstract sayHi(){System.out.println("Hi, I'm ProductA");}
}//继承抽象类实现产品A类
public class ProductB extends Product {//实现抽象产品方法@Overidepublic abstract sayHi(){System.out.println("Hi, I'm ProductB");}
}//工厂抽象类
public abstract class Factory {//抽象工厂方法public abstract Product createProduct();
}//具体工厂类FactoryA
public class FactoryA extends Factory {@Overidepublic Product createProduct() {System.out.println("生产了一个A");return new ProductA();//生产产品A}
}//具体工厂类FactoryB
public class FactoryB extends Factory {@Overidepublic Product createProduct() {System.out.println("生产了一个B");return new ProductB();//生产产品B}
}

2.6 工厂方法模式的优点与缺点

  • 优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品
  • 缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类

--------

3. 抽象工厂模式

3.1 抽象工厂模式的定义

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。这里的抽象角色就是产品族。后面我会单独讲解产品族的概念。抽象工厂,非常适合解决两个维度的组合产品的构造问题,取其中一个维度作为产品族,另外一个维度作为产品族中具体的多个产品。

3.2 产品族

产品族是具有相同属性的同类型产品;如宝马车,宝马1系,宝马2系,都属于宝马;

3.3 解决的问题

由于产品族可能会有很多产品,这样的话如果按照工厂方法模式的写法,那样就需要每次添加一个产品类和工厂类;这样就会添加很多类文件,这里抽象工厂模式,其实就是将产品抽象成产品族,一个产品可能具有不同属性,这里工厂类只需要产品属性的共性抽象出来。

3.4 抽象工厂模式的构成

  • 抽象工厂角色:是具体工厂角色必须实现的接口或者必须继承的父类。
  • 具体工厂角色:继承抽象工厂类,实现创建对应的具体产品的对象。
  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。这里抽象产品至少2个维度;
  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

3.5 抽象工厂模式的UML

3.6 代码实现

//抽象形状类
public abstract class Shape {public abstract void sayShape();
}//矩形类
public class Retangle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Retangle!");}
}//圆形类
public class Circle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Circle!");}
}//抽象颜色类
public abstract class Color {public abstract void sayColor();
}//红色类
public class Red extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm Red!");}
}//白色类
public class White extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm White!");}
}//抽象工厂类
public abstract class ShapeFactory {public abstract Shape createShape();public abstract Color createColor();
}//红色的圆
public class RedCircleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Circle();}@Overidepublic Color createColor() {return new Red();}
}//白色的圆
public class WhiteCircleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Circle();}@Overidepublic Color createColor() {return new White();}
}

3.7 抽象工厂模式的优点与缺点

  • 优点:1.当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。2.保证减少工厂类和具体产品的类添加。
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 工厂和抽象产品里加代码,又要在具体的里面加代码。

简单工厂模式、工厂方法模式与抽象工厂模式相关推荐

  1. 『创建型』简单工厂SimpleFactory、工厂方法FactoryMethod、抽象工厂AbstractFactory

    为什么80%的码农都做不了架构师?>>>    几点说明 永远不要纠结于在什么时候使用什么模式 永远不要纠结于什么模式适用于什么情景 永远不要去死记任何的模式 并不是说,23种设计模 ...

  2. 抽象工厂模式(三):抽象工厂模式概述

    3 抽象工厂模式概述 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品.抽象工厂模式定义如下:        抽象工厂模 ...

  3. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  4. 工厂模式详解(简单工厂模式,工厂方法模式,抽象工厂模式,只给出抽象工厂模式具体代码)

    1.简单工厂模式(Factory) 应用场景:又叫做静态工厂方法(StaticFactory Method)模式,但不属于 23 种设计模式之一.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决 ...

  5. php 抽象工厂类实例,PHP设计模式之抽象工厂

    这篇文章介绍的内容是关于PHP设计模式之抽象工厂 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 在学习过工厂方法之后,我所了解的工厂方法基本是去创建一个对象, 例如在玩游戏的时候,创 ...

  6. 商业模式新生代_商业模式设计方法视觉化思考——《商业模式新生代》笔记之九...

    前言:慢慢来,比较快."财不入急门","您赚不到认知之外的钱"点击头像关注我,和您一起每天学习一点商业思维,提升自己的商业认知.我始终相信,方向对了,认知到了, ...

  7. 【怎样写代码】工厂三兄弟之抽象工厂模式(四):抽象工厂模式

    如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...

  8. 商业模式新生代_商业模式设计方法:讲故事——《商业模式新生代》笔记之十一...

    前言:今天我们继续来了解第五种商业模式的设计方法:讲故事.原创不易,喜欢商业与财经内容的朋友点点关注,谢谢您这么帅/美还关注我! 01什么是讲故事? 讲故事,有读者心里可能会觉得,这不就是我们日常中的 ...

  9. 工厂模式(简单工厂、工厂方法、抽象工厂)

    简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决 ...

  10. [设计模式] ------ 对比总结:简单工厂模式、工厂方法模式、抽象工厂模式

    三个概念: 简单工厂模式:就是一个简单的工厂类,根据不同的入参类型,返回不同的父类引用的子类对象. 工厂方法模式:就是将生成哪个子类对象的过程,延迟到工厂子类实现,工厂父类只定义接口. 抽象工厂模式: ...

最新文章

  1. AAAI 2021 | 用于图拓扑演化的深度图谱进化网络
  2. Linux内核分析 - 网络[十七]:NetFilter之连接跟踪
  3. 带你手撸红黑树,高级Java开发必看
  4. pytest.5.参数化的Fixture
  5. 蓝桥杯2017年第八届C/C++省赛A组第一题-迷宫
  6. mysql 取字段内容的第一个字符并大写
  7. 《Redis设计与实现》阅读:Redis底层研究之简单动态字符串SDS
  8. html5音乐加大音量,怎么调大音乐声音 mp3音量增大器介绍【图解】
  9. 光伏产品标准 - IEC 61215:2021版系列简介及标准下载
  10. 中华酷联发展电商,警惕京东,且行且思考
  11. 2019/04/02 实现互联网的DNS架构
  12. Android 根据网络图片URL转Bitmap对象
  13. 云班课在计算机,云班课电脑版
  14. H5 会动的皮卡丘动画
  15. 2、公众号开发--自定义(简易模式)菜单以及素材的永久URL地址获取方法
  16. 高德地图-鼠标获取坐标
  17. google账号解除游戏绑定_如何把已经玩过的游戏绑定谷歌账号,要在谷歌play内操作的话...
  18. 阿里云code和git管理项目
  19. 华为HCIE实验LAB-1
  20. 计算机一级2021excel,2021年计算机一级EXCEL操作题-20210514115911.doc-原创力文档

热门文章

  1. selenium爬取拉勾网
  2. python 卡方分布值_卡方新动力2020高校算法建模挑战赛
  3. 天池小布助手对话短文本语义匹配-文本二分类实践(pytorch)
  4. 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)
  5. 基于matlab的频率特性测试仪,基于虚拟仪器的网络频率特性测试仪
  6. 心知天气Android开发,H5 实现天气效果(心知天气插件)
  7. linux用mkefs不能进行格式化,磁盘格式化命令 mkfs
  8. SceneTree类
  9. 分享时刻—今日一收获
  10. UVA 11134 Fabled Rook 枚举 multiset加速