工厂模式

80 阅读2分钟

了解,但是脑子里面一直没有体系,今天有时间整理一下

概念:在Java中,工厂设计模式是一种创建型设计模式,它主要用于封装对象的创建过程,将对象的实例化逻辑与客户端代码分离,从而提高代码的可维护性和可扩展性。

工厂模式有三种主要的变体:简单工厂模式、工厂方法模式和抽象工厂模式。我们分别来看

简单工厂模式

简单工厂模式通过一个工厂类来创建对象。这个工厂类根据传入的参数决定创建哪种类型的产品对象,客户端代码通过工厂类来获取对象,而不是直接使用new关键字。

缺点是当产品种类增加时,工厂类需要修改,这违反了开闭原则

一个例子辅助理解(只有一个产品接口,工厂是很笨的工厂😁):

 public interface Product {
     void use();
 }
 ​
 class ConcreteProductA implements Product {
     @Override
     public void use() {
         System.out.println("Using ConcreteProductA");
     }
 }
 ​
 class ConcreteProductB implements Product {
     @Override
     public void use() {
         System.out.println("Using ConcreteProductB");
     }
 }
 ​
 class SimpleFactory {
     public Product createProduct(String type) {
         if ("A".equals(type)) {
             return new ConcreteProductA();
         } else if ("B".equals(type)) {
             return new ConcreteProductB();
         }
         return null;
     }
 }
 ​
 public class Client {
     public static void main(String[] args) {
         SimpleFactory factory = new SimpleFactory();
         Product productA = factory.createProduct("A");
         productA.use();
         Product productB = factory.createProduct("B");
         productB.use();
     }
 }

工厂方法模式

工厂方法模式是将工厂抽象为接口,然后每一个产品去实现工厂接口。区别在于每个具体工厂类负责创建一种产品对象

也好理解,就是把工厂抽象为接口,然后产品去实现接口,在使用的时候直接通过工厂接口来获取产品对象

例子辅助理解(只能有一个产品接口,然后一个工厂接口,一个产品接口对应一个工厂接口😎):

 interface Product {
     void use();
 }
 ​
 class ConcreteProductA implements Product {
     @Override
     public void use() {
         System.out.println("Using ConcreteProductA");
     }
 }
 ​
 class ConcreteProductB implements Product {
     @Override
     public void use() {
         System.out.println("Using ConcreteProductB");
     }
 }
 ​
 interface Factory {
     Product createProduct();
 }
 ​
 class ConcreteFactoryA implements Factory {
     @Override
     public Product createProduct() {
         return new ConcreteProductA();
     }
 }
 ​
 class ConcreteFactoryB implements Factory {
     @Override
     public Product createProduct() {
         return new ConcreteProductB();
     }
 }
 ​
 public class Client {
     public static void main(String[] args) {
         Factory factoryA = new ConcreteFactoryA();
         Product productA = factoryA.createProduct();
         productA.use();
 ​
         Factory factoryB = new ConcreteFactoryB();
         Product productB = factoryB.createProduct();
         productB.use();
     }
 }

抽象工厂模式

多个产品接口,多个工厂接口🙌🙌🙌

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。