【设计模式】工厂模式篇

目录

Factory Pattern

1、定义

2、三个角色

3、优点

4、比喻了解

5、漫画

6、代码图例

7、代码示例

Factory Pattern

1、定义

创建型设计模式,提供了一种创建对象的最佳方式,而不用暴露对象的创建逻辑。 定义一个创建对象的接口,但让子类决定需要实例化的类是哪一个。

2、三个角色

  • 抽象产品(Product)
  • 具体产品 (Concrete Product)
  • 工厂(Factory)

具体来说,我们可以定义一个抽象的工厂类,里面包含一个创建产品的方法,该方法返回一个抽象产品类型的实例。然后我们可以为每个具体的产品定义一个具体的工厂,该工厂实现了抽象工厂中定义的创建产品的方法,并返回具体的产品实例。

3、优点

  • 它将创建的逻辑与客户端代码分离开来,从而降低了耦合性增加了代码的可维护性
  • 由于工厂类负责创建所有的产品对象,因此需要修改产品创建逻辑时,只需要修改工厂类即可,不会对客户端产生任何影响。

4、比喻了解

  • 当我们需要创建多个相似的对象时,使用工厂模式可以减少代码重复并提高代码可维护性。
  • 通俗来说,工厂模式就像是一个生产线。在一个工厂中,有很多工人,每个工人负责制作不同种类的产品。当客户需要一种产品时,客户只需告诉工厂要什么产品,工厂会自动调用对应的工人来制造这个产品。
  • 在编程中,我们也可以使用工厂模式实现类似的功能。我们可以定义一个工厂类,在工厂类中根据传入的参数创建不同的对象,并返回给客户端,从而避免了客户端直接与具体的产品类打交道。这样一来,如果需要添加新的产品,我们只需要在工厂类中添加相应的逻辑即可,而不需要修改客户端的代码。

5、漫画

没错 非常努力 画了图

首先,假设你是一家玩具公司的老板。你需要制造许多不同种类的玩具,例如玩具熊、小飞机、小手枪等等。你知道每个玩具都有自己独特的制作过程,因此你需要找到一种方法来有效地组织生产流程。

这就是工厂模式的用处了:您可以创建一个玩具工厂,该工厂将负责制造所有类型的玩具。相当于你雇佣了一批专门制造不同种类玩具的员工。

现在,让我们看看漫画中的玩具工厂是如何运作的:

老板拿着草图向工人们展示要制造的玩具样品,并告诉他们每种玩具所需的材料和步骤。

【设计模式】工厂模式篇_第1张图片

工人们开始根据老板的指示,生产不同种类的玩具。他们使用相同的工具和技术,但对于不同的玩具,使用不同的材料和步骤。

【设计模式】工厂模式篇_第2张图片

完成了许多不同种类的玩具,它们都通过传送带被运送到了质检部门。

【设计模式】工厂模式篇_第3张图片

经过一番检查和测试,工厂生产的每个玩具都被证明是符合标准的,并且可以出售给客户。

【设计模式】工厂模式篇_第4张图片

6、代码图例

+----------------+

| 工厂类 |

+----------------+

| + createProduct()|

+----------------+

             ^

             |

        +-------------+

        | 工人类 1 |

        +-------------+

        | + produce() |

        +-------------+

                ^

                |

        +-------------+

        | 工人类 2 |

        +-------------+

        | + produce() |

        +-------------+

            ^

            |

        +---------------+

        | 客户端代码 |

        +---------------+

        | + main() |

        +---------------+

在这个图中,有一个工厂类和两个工人类。工厂类中有一个 createProduct() 方法,该方法根据传入的参数创建不同类型的产品对象,并将其返回给客户端代码。客户端代码只需调用工厂类的方法即可获取所需的产品对象。

每个工人类都有自己的 produce() 方法,用于生产不同类型的产品。当工厂类调用 createProduct() 方法时,实际上是内部调用了对应的工人类的 produce() 方法来创建产品对象。

7、代码示例

// 1、定义一个产品接口Product,它定义了一个方法 doSomething
public interface Product {
    void doSomething();
}
// 2、定义两个具体的产品类,分别实现Product 接口:
public class ConcreteProductA implements Product{
    @Override
    public void doSomething(){
        System.out.println("ConcreteProductA doSomething");
    } 
}

public class ConcreteProductB implements Product{
    @Override
    public void doSomething(){
        System.out.println("ConcreteProductB doSomething");
    } 
}

// 3、定义一个抽象工厂类 Factory ,其中包含一个返回产品对象的抽象方法 createProduct
public abstract class Factory{
    public abstract Product createProduct();
}
// 4、可以为每个产品定义一个具体的工厂类,这些工厂类都继承来自抽象工厂的Factory,并实现createProduct 方法
public class ConcreteFactoryA extends Factory{
    @Override
    public Product creaProduct(){
        return new ConcreteProductA();
    }
}


public class ConcreteFactoryB extends Factory{
    @Override
    public Product creaProduct(){
        return new ConcreteProductB();
    }
}


// 5、现在我们就可以通过具体工厂来创建产品,而无需暴露给客户端
Factory factory = new ConcreteFactoryA();
Product product = factory.createProduct();

product.doSomething();
// ConcreteProductA doSomething

你可能感兴趣的:(软件工程,设计模式,java,开发语言)