工厂模式
工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
介绍
**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
工厂模式包含以下几个核心角色:
- 抽象产品(Abstract Product):定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口,规定了产品对象的共同方法。
- 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
- 抽象工厂(Abstract Factory):声明了创建产品的抽象方法,可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建具体产品的对象。
实现
我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。
java代码实现
创建工厂
抽象工厂
工厂里面两个产品
public interface Creator {
Product createProduct();
Product createProduct2();
}
实例工厂
创建产品的对象
public class ConcreteCreator implements Creator {
@Override
public Product createProduct() {
return new ConcreteProduct();
}
@Override
public Product createProduct2() {
return new hhh();
}
}
抽象产品
public interface Product {
void doSomething();
}
具体产品
都实现了Product这个接口,产品的可以有多种
public class ConcreteProduct implements Product {
@Override
public void doSomething() {
System.out.println("具体产品做了某些事情");
}
}
public class hhh implements Product{
@Override
public void doSomething() {
System.out.println("hhhhhhh");
}
}
测试用例
public class Main {
public static void main(String[] args) {
// 创建工厂对象
Creator creator = new ConcreteCreator();
//创建工厂里面各个产品的对象,对象的创建都在工厂内部完成
Product product = creator.createProduct();
// product2是如何创建的,直接去工厂获取就行。
Product product2 = creator.createProduct2();
//产品去做事,不同的产品做不同的事
product2.doSomething();
product.doSomething();
System.out.println("Hello world!");
}
}
执行结果
代码解析
- 客户端代码(
Client):其中包含一个main方法,用来演示如何使用工厂模式创建产品并调用其方法。 - 抽象产品接口(
Product):定义了产品的基本方法。 - 具体产品类(
ConcreteProduct):实现了抽象产品接口中定义的方法。 - 抽象工厂接口(
Creator):定义了工厂方法(createProduct),用来创建产品实例。 - 具体工厂类(
ConcreteCreator):实现了抽象工厂接口中的工厂方法(createProduct),用来创建具体的产品实例。
首先创建了一个具体的工厂实例(ConcreteCreator)
然后通过工厂实例的 createProduct 方法来创建两个具体的产品实例(ConcreteProduct)。
最后调用产品实例的 doSomething 方法来执行具体的功能。
通俗解释就是,首先我先去了工厂相当于创建了工厂实例,然后我挑选我需要的产品相当于工厂实例创建不同的产品实例任你挑选,然后就等待提货就行相当于调用产品实例的方法执行某个功能。
总结
工厂模式如何定义
工厂方法模式定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式使一个类的实例化延迟到其子类。
在我们上面的例子当中,我们创建接口的接口的对象是Creator,我们实现了这个接口,在这个接口里面实现了两个产品的实例化
工厂方法模式通过定义一个抽象的工厂接口来声明创建产品对象的操作,而将实际创建工作推迟到子类中进行。这样做的好处是,我们可以针对不同的产品需求,提供一个统一的接口,而使用者只需要关心接口,而不需要关心具体的实现细节。在需要新增产品时,只需要添加一个新的产品类和相应的工厂类即可。
**注意事项:**作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。