工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
- 简单工厂模式:把创建产品的对象称为工厂,被创建的对象称为产品。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式。
- 工厂方法模式:是对简单工厂模式的进一步抽象化,可以使系统在不修改原来代码的情况下引进新的产品。
- 抽象工厂模式:抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
简单工厂模式
特点:
- 在简单工厂模式中创建实例的方法通常为静态方法
- 简单工厂模式有一个具体的工厂类,可以生成多个不同的产品
- 客户端无需知道所创建具体产品的类名,只需知道参数即可
应用场景:对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
模式组成:
- 简单工厂:是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
- 抽象产品:是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
- 具体产品:是简单工厂模式的创建目标。
public class Client {
public static void main(String[] args) {
}
//抽象产品
public interface Product {
void show();
}
//具体产品:ProductA
static class ConcreteProduct1 implements Product {
public void show() {
System.out.println("具体产品1显示...");
}
}
//具体产品:ProductB
static class ConcreteProduct2 implements Product {
public void show() {
System.out.println("具体产品2显示...");
}
}
final class Const {
static final int PRODUCT_A = 0;
static final int PRODUCT_B = 1;
}
//简单工厂
static class SimpleFactory {
public static Product produce(int kind) {
switch (kind) {
case Const.PRODUCT_A:
return new ConcreteProduct1();
case Const.PRODUCT_B:
return new ConcreteProduct2();
}
return null;
}
}
}
工厂方法模式
特点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类
应用场景:
- 客户只知道工厂名不知道产品名的情况。
- 客户不关心产品创造的细节只关心产品的品牌
模式组成:
- 抽象工厂:提供创建产品的接口。
- 具体工厂:实现抽象工厂中的抽象方法。
- 抽象产品:定义产品的规范,描述产品的主要特性和功能。
- 具体产品:实现抽象产品角色所定义的接口。
//抽象产品:提供了产品的接口
interface Product {
public void show();
}
//具体产品1:实现抽象产品中的抽象方法
class ConcreteProductOne implements Product {
public void show() {
System.out.println("具体产品1显示...");
}
}
//具体产品2:实现抽象产品中的抽象方法
class ConcreteProductTwo implements Product {
public void show() {
System.out.println("具体产品2显示...");
}
}
//抽象工厂:提供了产品的生成方法
interface AbstractFactory {
public Product newProduct();
}
//具体工厂1:实现了产品的生成方法
class ConcreteFactoryOne implements AbstractFactory {
public Product newProduct() {
System.out.println("具体工厂1生成-->具体产品1...");
return new ConcreteProductOne();
}
}
//具体工厂2:实现了产品的生成方法
class ConcreteFactoryTwo implements AbstractFactory {
public Product newProduct() {
System.out.println("具体工厂2生成-->具体产品2...");
return new ConcreteProductTwo();
}
}
//测试类
public class Test {
public static void main(String[] args) {
ConcreteFactoryOne concreteFactoryOne = new ConcreteFactoryOne();
concreteFactoryOne.newProduct().show();
ConcreteFactoryTwo concreteFactoryTwo = new ConcreteFactoryTwo();
ConcreteFactoryTwo.newProduct().show();
}
}
运行结果:
具体工厂1生成-->具体产品1...
具体产品1显示...
具体工厂2生成-->具体产品2...
具体产品2显示...
抽象工厂模式
特点:
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品族。
- 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码。
应用场景:
- 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
- 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
模式组成:
- 抽象工厂:提供了创建产品的接口,它包含多个创建产品的方法 ,可以创建多个不同等级的产品。
- 具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
//抽象产品:动物类
interface Animal {
public void show();
}
//具体产品:马类
class Horse implements Animal {
public void show() {
System.out.println("骏马奔腾...");
}
}
//具体产品:牛类
class Cattle implements Animal {
public void show() {
System.out.println("老牛耕田...");
}
}
//抽象产品:植物类
interface Plant {
public void show();
}
//具体产品:水果类
class Fruit implements Plant {
public void show() {
System.out.println("水果清香...");
}
}
//具体产品:蔬菜类
class Vegetables implements Plant {
public void show() {
System.out.println("蔬菜健康...");
}
}
//抽象工厂:农场类
interface Farm {
public Animal newAnimal();
public Plant newPlant();
}
//具体工厂:新疆农场类
class XJfarm implements Farm {
public Animal newAnimal() {
System.out.println("新牛出生!");
return new Cattle();
}
public Plant newPlant() {
System.out.println("蔬菜长成!");
return new Vegetables();
}
}
//具体工厂:内蒙农场类
class NMfarm implements Farm {
public Animal newAnimal() {
System.out.println("新马出生!");
return new Horse();
}
public Plant newPlant() {
System.out.println("水果长成!");
return new Fruit();
}
}
//测试类
public class Test {
public static void main(String[] args) {
XJfarm xjfarm = new XJfarm();
xjfarm.newAnimal().show();
xjfarm.newPlant().show();
NMfarm nmfarm = new NMfarm();
nmfarm.newAnimal().show();
nmfarm.newPlant().show();
}
}
运行结果:
新牛出生!
老牛耕田...
蔬菜长成!
蔬菜健康...
新马出生!
骏马奔腾...
水果长成!
水果清香...