工厂模式

消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改

工厂模式分为:


  • 简单工厂:通过简单的判断创建不同的实例对象,如果要添加新的产品,势必要改动源码,那这违反开闭原则呢? 实际上,对于不需要频繁添加新的产品的需求,也是完全可以接受的。

  • 工厂方法:定义了一个创建对象的接口,具体实例化哪一个由子类选择,这种方式扩展性高,实现解耦,但是每新增一个产品就得新增一个实现类

  • 抽象工厂:抽象工厂为产品家族提供接口。通过抽象工厂所提供的接口,可以创建产品的家族,复用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各式各样的工厂,制造出各种不同的产品。

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。这样一来,客户就从具体的产品中被解耦。

抽象工厂的方法经常以工厂方法的方式实现。

(引用Head First 设计模式)

我们不需要关注内部具体实现,只需要拿着工厂生产出来的产品使用即可,使用场景举例,jdbc创建连接对象,线程池创建线程等

  1. class Factory{ public FacObj create(){ return new FacObj (); } }

建造者模式

建造模式:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

主要角色如下:

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

该模式的主要优点如下:

各个具体的建造者相互独立,有利于系统的扩展。客户端不必知道产品内部组成的细节,便于控制细节风险。

其缺点如下:

产品的组成部分必须相同,这限制了其使用范围。如果产品的内部变化复杂,该模式会增加很多的建造者类。

建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

工厂模式注重的是整体对象的创建方法,而建造者模式注重的是对象的创建过程,创建对象的过程方法可以在创建时自由调用

举个栗子:

  1. @Data public class Product {
  2. private String partA;
  3. private String partB;
  4. private String partC;
  5. }
  6. public interface Builder {
  7. void setPartA();
  8. void setPartB();
  9. void setPartC();
  10. }
  11. public class BuilderImpl implements Builder {
  12. Product product;
  13. public BuilderImpl(Product product) {
  14. this.product = product;
  15. }
  16. @Override
  17. public void setPartA() {
  18. product.setPartA("构建模块A");
  19. }
  20. @Override
  21. public void setPartB() {
  22. product.setPartB("构建模块B");
  23. }
  24. @Override
  25. public void setPartC() {
  26. product.setPartC("构建模块C");
  27. }
  28. }
  29. public class ProductManager {
  30. public Product manageProd() {
  31. Product product = new Product();
  32. BuilderImpl builder = new BuilderImpl(product);
  33. builder.setPartC();
  34. builder.setPartA();
  35. builder.setPartB();
  36. return product;
  37. }
  38. }
  39. public static void main(String[] args) {
  40. ProductManager productManager=new ProductManager();
  41. Product product = productManager.manageProd();
  42. System.out.println(product.toString());
  43. }

使用场景

创建对象属性很复杂时使用建造者模式,分模块创建对象分别赋值。

抽象工厂

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

类似于接口MVC接口定义,当然他也可以是抽象类的具体实现,说直白点,就是定义返回值和形参,具体怎么操作就自己去实现。