当前位置: 首页 > news >正文

工厂设计模式

基本概念:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

分为三类:

  • 简单工厂模式Simple Factory:不利于产生系列产品;

  • 工厂方法模式Factory Method:又称为多形性工厂;

  • 抽象工厂模式Abstract Factory:又称为工具箱,产生产品族,但不利于产生新的产品;

一、简单工厂模式

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。

在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。

先来看看它的组成:

  • 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

  • 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

  • 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

实例代码:

// 抽象产品
public abstract class Simple {public Simple() {}
}
class SimpleA extends Simple {public SimpleA() {super();}
}
class SimpleB extends Simple {public SimpleB() {super();}
}//简单工厂模式
public class SimpleFactory {/** 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化* */public SimpleFactory() {}// 定义一个用于创建对象的接口public static Simple creator(int which) {switch (which) {case 1 -> {return new SimpleA();}case 2 -> {return new SimpleB();}default -> {return null;}}}
}//测试
public class SimpleFactoryTest {public static void main(String[] args) {Simple simpleA = SimpleFactory.creator(1);Simple simpleB = SimpleFactory.creator(2);}
}

缺点:在普通工厂方法模式中,如果传递的数值出错,则不能正确创建对象

二、工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

来看下它的组成:

  • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

  • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象

  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

示例代码:

// 抽象产品接口
public  interface Movable {void run();
}
// 具体产品角色
class Car implements Movable {@Overridepublic void run() {System.out.println("汽车在。。。。");}
}
// 具体产品角色
class Plane implements Movable {@Overridepublic void run() {System.out.println("飞机在。。。。");}
}//抽象工厂角色
public abstract class VehicleFactory {public VehicleFactory() {}abstract Movable creator();/**工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。** */
}
// 具体工厂
class CarFactory extends VehicleFactory{@Overridepublic Movable creator() {return new Car();}
}
// 具体工厂
class PlaneFactory extends VehicleFactory{@Overridepublic Movable creator() {return new Plane();}
}//测试
public class FactoryMethodTest {public static void main(String[] args) {CarFactory carFactory = new CarFactory();carFactory.creator().run();PlaneFactory planeFactory = new PlaneFactory();planeFactory.creator().run();}
}

简单工厂和工厂方法模式的比较?

工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。

反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

缺点:该工厂类负责创建所有实例,如果有新的类加入,需要不断的修改工厂类,不利于后期的维护

三、抽象工厂模式

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。

示例代码:

// 抽象产品
public interface Food {void printName();
}
// 具体产品角色
class Apple implements Food {@Overridepublic void printName() {System.out.println("这是苹果");}
}
// 具体产品角色
class Banana implements Food {@Overridepublic void printName() {System.out.println("这是香蕉");}
}// 抽象产品
public interface Vehicle {void run();
}
// 具体产品角色
class BYDCar implements Vehicle {@Overridepublic void run() {System.out.println("比亚迪在行驶");}
}
// 具体产品角色
class BWMCar implements Vehicle {@Overridepublic void run() {System.out.println("宝马在行驶");}
}// 抽象工厂
public abstract class AbstractFactory {/** 在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。* */abstract public Food createFood();abstract public Vehicle createVehicle();
}// 具体工厂,其中Food,Vehicle是抽象类
class DefaultFactory extends AbstractFactory {@Overridepublic Food createFood() {return new Apple();}@Overridepublic Vehicle createVehicle() {return new BYDCar();}
}// 具体工厂,其中Food,Vehicle是抽象类
class SecondFactory extends AbstractFactory {@Overridepublic Food createFood() {return new Banana();}@Overridepublic Vehicle createVehicle() {return new BWMCar();}
}//测试
public class AbstractFactoryTest {public static void main(String[] args) {DefaultFactory factory = new DefaultFactory();factory.createFood().printName();factory.createVehicle().run();SecondFactory factory1 = new SecondFactory();factory1.createFood().printName();factory1.createVehicle().run();}
}

总结

  • 简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。

  • 工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。

  • 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

http://www.lryc.cn/news/2029.html

相关文章:

  • IO多路转接 —— poll和epoll
  • 计算机网络整理-问答
  • JS 实现抛物线动画案例
  • CSGO搬砖项目,23年最适合小白的项目!
  • 谈谈会话管理
  • Linux查看JVM FULL GC频率
  • java世界String的那些事
  • 【图像配准】多图配准/不同特征提取算法/匹配器比较测试
  • 2023金三银四季跳槽季,啃完这软件测试面试题,跳槽不就稳稳的了
  • 【C++详解】——vector类
  • uniapp 离线本地打包
  • 初识马尔科夫模型(Markov Model)
  • CentOS7 ifconfig(或 ip addr)命令不显示IP地址
  • 2023/2/10总结
  • 2023最新版!宝塔面板Docker自建Bitwarden密码管理
  • 【Hello Linux】 Linux基础命令
  • 151、【动态规划】leetcode ——2. 01背包问题:二维数组+一维数组(C++版本)
  • 2023-02-09 - 3 Elasticsearch基础操作
  • 云原生系列之使用 prometheus监控MySQL实战
  • 电脑分盘怎么分?分盘详细教程来了,图文教学
  • Element UI框架学习篇(四)
  • Revit快速材质切换:同一墙面赋予不同材质的方法
  • 【Linux operation 56】Linux 系统验证端口连通性
  • @Valid注解配合属性校验注解完成参数校验并且优化异常处理
  • 每天一道大厂SQL题【Day08】
  • 朗润国际期货:2023/2/10今日期市热点及未来焦点
  • TLV73312PQDRVRQ1稳压器TPS622314TDRYRQ1应用原理图
  • 课程回顾|以智能之力,加速媒体生产全自动进程
  • C库函数文件操作(fopen、fread、fwrite、fclose)
  • 【Java|golang】1798. 你能构造出连续值的最大数目