工厂模式
消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改
工厂模式分为:
简单工厂:通过简单的判断创建不同的实例对象,如果要添加新的产品,势必要改动源码,那这违反开闭原则呢? 实际上,对于不需要频繁添加新的产品的需求,也是完全可以接受的。
工厂方法:定义了一个创建对象的接口,具体实例化哪一个由子类选择,这种方式扩展性高,实现解耦,但是每新增一个产品就得新增一个实现类
抽象工厂:抽象工厂为产品家族提供接口。通过抽象工厂所提供的接口,可以创建产品的家族,复用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同上下文中实现各式各样的工厂,制造出各种不同的产品。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。这样一来,客户就从具体的产品中被解耦。
抽象工厂的方法经常以工厂方法的方式实现。
(引用Head First 设计模式)
我们不需要关注内部具体实现,只需要拿着工厂生产出来的产品使用即可,使用场景举例,jdbc创建连接对象,线程池创建线程等
class Factory{ public FacObj create(){ return new FacObj (); } }
建造者模式
建造模式:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
主要角色如下:
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
该模式的主要优点如下:
各个具体的建造者相互独立,有利于系统的扩展。客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点如下:
产品的组成部分必须相同,这限制了其使用范围。如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
工厂模式注重的是整体对象的创建方法,而建造者模式注重的是对象的创建过程,创建对象的过程方法可以在创建时自由调用
举个栗子:
@Data public class Product {
private String partA;
private String partB;
private String partC;
}
public interface Builder {
void setPartA();
void setPartB();
void setPartC();
}
public class BuilderImpl implements Builder {
Product product;
public BuilderImpl(Product product) {
this.product = product;
}
@Override
public void setPartA() {
product.setPartA("构建模块A");
}
@Override
public void setPartB() {
product.setPartB("构建模块B");
}
@Override
public void setPartC() {
product.setPartC("构建模块C");
}
}
public class ProductManager {
public Product manageProd() {
Product product = new Product();
BuilderImpl builder = new BuilderImpl(product);
builder.setPartC();
builder.setPartA();
builder.setPartB();
return product;
}
}
public static void main(String[] args) {
ProductManager productManager=new ProductManager();
Product product = productManager.manageProd();
System.out.println(product.toString());
}
使用场景
创建对象属性很复杂时使用建造者模式,分模块创建对象分别赋值。
抽象工厂
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
类似于接口MVC接口定义,当然他也可以是抽象类的具体实现,说直白点,就是定义返回值和形参,具体怎么操作就自己去实现。