创建型模式
创建型模式对类的实例化过程进行了抽象,能够将软件模式中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节。
创建型模式描述了如何将对象的创建和使用分离,让用户在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。
简单工厂模式概述
简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的示例,被创建的实例通常都具有共同的父类。
由于在简单工厂模式中用于创建实例的方法通常是静态方法,因此简单工厂模式又被称为静态工厂方法模式,它是一种创建型模式。
简单工厂模式的要点在于用户需要什么时,只需要传入一个正确的参数就可以获取所需要的对象,而无需知道其创建细节。
简单工厂模式结构与实现
简单工厂模式结构
简单工厂模式包含以下三个角色
Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。
Product(抽象产品角色):他是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需要定义一个通用的工厂方法,因为所有创建的具体产品独享都是其子类对象。
ConcerteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例,每一个具体产品角色都继承了抽象产品角色,需要实现现在抽象产品中声明的抽象方法。 
简单工厂模式实现
以下以形状生成为例,展示简单工厂模式的实现:
1. 抽象产品:Shape接口
定义所有形状的公共行为(如绘制):
// 抽象产品:形状接口
public interface Shape {
void draw(); // 绘制方法
}
2. 具体产品:实现抽象产品
创建三种具体形状(圆形、方形、三角形):
// 具体产品:圆形
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
// 具体产品:方形
public class Square implements Shape {
@Override
public void draw() {
System.out.println("绘制方形");
}
}
// 具体产品:三角形
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println("绘制三角形");
}
}
3. 工厂类:ShapeFactory
根据参数创建对应形状的实例:
// 工厂类:形状工厂
public class ShapeFactory {
// 静态方法:根据类型创建产品
public static Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
// 根据参数判断创建哪种产品
switch (shapeType.toLowerCase()) {
case "circle":
return new Circle();
case "square":
return new Square();
case "triangle":
return new Triangle();
default:
throw new IllegalArgumentException("不支持的形状类型:" + shapeType);
}
}
}
4. 客户端调用
通过工厂类获取产品并使用:
// 客户端测试类
public class Client {
public static void main(String[] args) {
// 通过工厂类获取圆形产品
Shape circle = ShapeFactory.getShape("circle");
circle.draw(); // 输出:绘制圆形
// 获取方形产品
Shape square = ShapeFactory.getShape("square");
square.draw(); // 输出:绘制方形
// 获取三角形产品
Shape triangle = ShapeFactory.getShape("triangle");
triangle.draw(); // 输出:绘制三角形
}
}
关于创建对象和使用对象
素有工厂模式都强调一点:两个类A和B之间的关系应该仅仅是A创建B或是A使用B,而不能两种关系都有。将对象的创建和使用分离,是的系统更加符合单一职责原则,有利于功能的复用和系统的维护。
将对象的创建和使用分离还有一个好处:防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类中。
但是并不需要为系统中的每一个类都配备一个工厂类,如果一个类很简单,而且不存在太多变化,其构造过程很简单,此时就无需为其提供工厂类,直接在使用之前实例化即可。
简单工厂模式的简化
有时候,为了简化简单工厂模式,可以将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中。
简单工厂模式优缺点与适用环境
| 优点 | 缺点 |
|---|---|
| 客户端与产品实现解耦,无需知道产品创建细节 | 违反开闭原则:新增产品需修改工厂类代码 |
| 集中管理产品创建逻辑,便于维护 | 工厂类职责过重,若产品类型过多会导致代码臃肿 |
| 客户端调用简单,只需传入参数即可获取产品 | 扩展性差,不适用于产品类型频繁变化的场景 |
适用场景
- 产品类型较少且不会频繁新增时(如固定几种支付方式:微信、支付宝、银行卡);
- 客户端不需要知道产品创建过程,只需结果时;
- 希望集中管理产品创建逻辑,避免代码重复时。
Comments