设计模式——工厂方法模式
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
📖学习地址https://www.bilibili.com/video/BV1Kb411W75N?p=356&vd_source=461545ff50a35eaeaa8218ecdc5f7152
工厂模式概述
🎈工厂模式适合凡是出现了大量的产品需要创建并且具有共同的接口时可以通过工厂方法模式进行创建。
工厂模式实现了创建者与调用者的分离即将创建对象的过程屏蔽隔离起来达到提高灵活性的目的
核心本质
实例化对象用工厂方法代替 new 操作。
将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
工厂模式的分类
简单工厂模式
用来生产同一等级结构中的任意产品。对于增加新的产品 需要修改已有代码
工厂方法模式
用来生产同一等级结构中的固定产品。支持增加任意产品。简单工厂和工厂方法可以理解为广义上的工厂方法
抽象工厂模式
用来生产不同产品族的全部产品。对于增加新的产品无能为力支持增加产品族
在以下的三种模式中
第一种简单工厂如果传入的字符串有误不能正确创建对象
第三种静态工厂相对于第二种多个工厂不需要实例化工厂类所以大多数情况下我们会选用第三种——静态工厂方法模式。
一、无工厂模式
interface Car{
void run();
}
class Audi implements Car{
public void run() {
System.out.println("奥迪在跑");
}
}
class BYD implements Car{
public void run() {
System.out.println("比亚迪在跑");
}
}
public class Client01 {
public static void main(String[] args) {
Car a = new Audi();
Car b = new BYD(); a.run();
b.run();
}
}
二、简单工厂模式
简单工厂模式从命名上就可以看出这个模式一定很简单。它存在的目的很简单 定义一个用于创建对象的工厂类。
调用者只要知道他要什么从哪里拿如何创建不需要知道。分工多出了一个专门生产 Car 的实现类对象的工厂类。把调用者与创建者分离。
小结
简单工厂模式也叫静态工厂模式就是工厂类一般是使用静态方法通过接收的参数的不同来返回不同的实例对象。
缺点对于增加新产品不修改代码的话是无法扩展的。违反了开闭原则对扩展开放对修改封闭。
interface Car {
void run();
}
class Audi implements Car {
public void run() {
System.out.println("奥迪在跑");
}
}
class BYD implements Car {
public void run() {
System.out.println("比亚迪在跑");
}
}
//工厂类
class CarFactory {
//方式一
public static Car getCar(String type) {
if ("奥迪".equals(type)) {
return new Audi();
} else if ("比亚迪".equals(type)) {
return new BYD();
} else {
return null;
}
}
//方式二
// public static Car getAudi() {
// return new Audi();
// }
// public static Car getByd() {
// return new BYD();
// }
}
public class Client02 {
public static void main(String[] args) {
Car a = CarFactory.getCar(" 奥 迪 ");
a.run();
Car b = CarFactory.getCar("比亚迪");
b.run();
}
}
三、工厂方法模式
为了避免简单工厂模式的缺点不完全满足 OCP对扩展开放对修改关闭。
工厂方法模式和简单工厂模式最大的不同在于简单工厂模式只有一个对于一个项目或者一个独立的模块而言工厂类而工厂方法模式有一组实现了相同接口的工厂类。
这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
总结
简单工厂模式与工厂方法模式真正的避免了代码的改动了没有。在简单工厂模式中新产品的加入要修改工厂角色中的判断语句而在工厂方法模式中要么将判断逻辑留在抽象工厂角色中要么在客户程序中将具体工厂角色写死就像上面的例子一样。而且产品对象创建条件的改变必然会引起工厂角色的修改。面对这种情况Java 的反射机制与配置文件的巧妙结合突破了限制——这在Spring 中完美的体现了出来。
package com.atguigu.pattern.factory.method;
interface Car{
void run();
}
//两个实现类
class Audi implements Car{
public void run() {
System.out.println("奥迪在跑");
}
}
class BYD implements Car{
public void run() {
System.out.println("比亚迪在跑");
}
}
//工厂接口
interface Factory{
Car getCar();
}
//两个工厂类
class AudiFactory implements Factory{
public Audi getCar(){
return new Audi();
}
}
class BydFactory implements Factory{
public BYD getCar(){
return new BYD();
}
}
public class Client {
public static void main(String[] args) {
Car a = new AudiFactory().getCar(); //相当于new Audi()
Car b = new BydFactory().getCar(); //相当于new BYD()
a.run();
b.run();
}
}
四、抽象工厂模式
抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。
而且抽象工厂模式是三个里面最为抽象、最具一般性的。
抽象工厂模式的用意为给客户端提供一个接口可以创建多个产品族中的产品对象。
而且使用抽象工厂模式还要满足一下条件
1、系统中有多个产品族而系统一次只可能消费其中一族产品。
2、同属于同一个产品族的产品以其使用。