【编程基础心法】「创建模式系列」让我们一起来学编程界的“兵法”设计模式(工厂模式)
- 设计模式之间的千丝万缕
- 工厂模式
- 简单工厂方法
- 简单工厂定义
- 多方法模式
- 多个静态方法模式
- 简单工厂模式的问题
- 工厂方法模式
- 定义工厂抽象接口
- 工厂方法存在的问题
- 抽象工厂模式
- 实现抽象工厂类接口
- 定义对应的产品对象类
- 分析抽象工厂和工厂模式的区别
- 工厂方法模式
- 抽象工厂模式
- 区别
- 总结
设计模式之间的千丝万缕
从这一块开始,我们详细介绍 Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析。
下面是关于设计模式之间的一个千丝万缕的关系,就如同网状结构一样,他们之间相辅相成互相依赖着。
接下来让我们来进行给大家介绍和展开我们的第一个部分的内容工厂模式。
工厂模式
工厂模式是一种常用的设计模式,它可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。在Java中,工厂模式有多种实现方式,本文将介绍其中的三种常见实现方式。
简单工厂方法
简单工厂模式是工厂模式的最基本形式,它通过一个工厂类来创建对象。而简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。
在Java中,我们可以通过一个静态方法来实现简单工厂模式。下面是一个简单工厂模式的示例代码:
简单工厂定义
首先我们先定义一个接口Product,作为我们的产品模型。
public interface Product {
void use();
}
接下来我们定义一下对应的实现类,作为不同产品的一个实现实体,方便我们用工厂方法去调用进行构建。
public class ProductA implements Product {
@Override
public void use() {
System.out.println("Product A is used.");
}
}
public class ProductB implements Product {
@Override
public void use() {
System.out.println("Product B is used.");
}
}
接下来我们定一下关于对应的工厂方法,这个工厂方法作为构建对象的一个工厂类。
public class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ProductA();
} else if (type.equals("B")) {
return new ProductB();
} else {
return null;
}
}
}
在上面的代码中,我们定义了一个简单工厂类SimpleFactory,它有一个静态方法createProduct,根据传入的参数type来创建不同的产品对象。我们还定义了一个Product接口和两个实现类ProductA和ProductB,它们都实现了Product接口。
例如:当我们传递A的时候和传递B的时候,构建了是不同的对象。
多方法模式
是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确
创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
实现代码如下:
public class SimpleFactory {
public Product createProductA() {
return new ProductA();
}
public Product createProductB() {
return new ProductB();
}
}
多个静态方法模式
静态方法的模式和多方法模式很像,只是单纯的将方法的类型换成静态方法进行修饰。
public class SimpleFactory {
public static Product createProductA() {
return new ProductA();
}
public static Product createProductB() {
return new ProductB();
}
}
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
简单工厂模式的问题
使用简单工厂模式的好处是可以将对象的创建和使用分离,客户端只需要知道如何使用产品对象,而不需要知道如何创建产品对象。
但是,简单工厂模式的缺点是如果需要添加新的产品类型,就需要修改工厂类的代码,违反了开闭原则,由此,我们诞生了一种升级版的简单工厂模式,我们定义为工厂模式。。
工厂方法模式
工厂方法模式是对简单工厂模式的改进,它将工厂类抽象成一个接口,每个具体的产品类都有一个对应的工厂类来创建它。
下面是一个工厂方法模式的示例代码:
定义工厂抽象接口
首先我们定义了一个抽象的工厂接口类。
public interface Factory {
Product createProduct();
}
随后我们又实现了这个工厂接口类。我们分别对产品A和产品B进行定义和实现工厂接口类的功能,如下所示:
public class ProductAFactory implements Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
public class ProductBFactory implements Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
在上面的代码中,我们定义了一个工厂接口Factory和两个具体的工厂类ProductAFactory和ProductBFactory,它们都实现了Factory接口,分别用来创建ProductA和ProductB对象。我们还定义了一个Product接口和两个实现类ProductA和ProductB,它们都实现了Product接口。
工厂方法存在的问题
使用工厂方法模式的好处是可以将对象的创建和使用分离,每个产品类都有一个对应的工厂类来创建它,可以很方便地添加新的产品类型。但是,工厂方法模式的缺点是需要为每个产品类型都创建一个对应的工厂类,增加了代码量,由此我们又生成了一个更加高级的工厂模式,我们称之为抽象工厂模式。
抽象工厂模式
抽象工厂模式是对工厂方法模式的进一步改进,它将一组相关的产品对象组成一个工厂类,可以创建多个产品对象。下面是一个抽象工厂模式的示例代码:
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
首先我们先定义了一个超像的工厂首先我们先定义了一个抽象的工厂方法,那么这个抽象的工厂方法里面定义了分别创建产品A和产品B的方法。
实现抽象工厂类接口
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
为了体现抽象工厂方法的优势,我们定义了四个产品的对象类。
定义对应的产品对象类
下面我们定义了四个产品的对象。。
public class ConcreteProductA1 implements ProductA {
@Override
public void use() {
System.out.println("Concrete Product A1 is used.");
}
}
public class ConcreteProductA2 implements ProductA {
@Override
public void use() {
System.out.println("Concrete Product A2 is used.");
}
}
public class ConcreteProductB1 implements ProductB {
@Override
public void use() {
System.out.println("Concrete Product B1 is used.");
}
}
public class ConcreteProductB2 implements ProductB {
@Override
public void use() {
System.out.println("Concrete Product B2 is used.");
}
}
在上面的代码中,我们定义了一个抽象工厂接口AbstractFactory和两个具体的工厂类ConcreteFactory1和ConcreteFactory2,它们都实现了AbstractFactory接口,分别用来创建一组相关的产品对象。我们还定义了两个产品接口ProductA和ProductB,以及四个具体的产品类ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2,它们都实现了对应的产品接口。
使用抽象工厂模式的好处是可以创建一组相关的产品对象,可以很方便地添加新的产品类型和工厂类。但是,抽象工厂模式的缺点是需要为每个产品类型都创建一个对应的产品接口和具体的产品类,增加了代码量。
分析抽象工厂和工厂模式的区别
工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:
工厂方法模式
- 具有单个抽象产品类,可以派生出多个具体产品类。
- 具有单个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式
- 具有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
- 具有单个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。
区别
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
工厂方法创建 “一种” 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。
总结
工厂模式是一种常用的设计模式,可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。在Java中,工厂模式有多种实现方式,包括简单工厂模式、工厂方法模式和抽象工厂模式。选择哪种实现方式取决于具体的需求和场景。