This page looks best with JavaScript enabled

工厂方法模式

 ·  ☕ 1 min read

在需要生成复杂对象的地方,可以使用工厂方法模式。

使用场景

在需要生成复杂对象的地方,可以使用工厂方法模式。定义一个创建对象的接口,让子类工厂决定创建怎样的类。

类图

@startuml

abstract class Product{
+ method():Void
}

class ConcreteProduct extends Product{
+ method():Void
}

abstract class Factory{
+ createProduct(): Product
}

class ConcreteFactory extends Factory{
+ createProduct(): Product
}

ConcreteFactory .> ConcreteProduct

@enduml
  • Product: 工厂将生产的产品的抽象
  • ConcreteProduct: 一种具体的产品
  • Factory: 工厂的抽象,定义了生产产品的方法
  • ConcreteFactory: 生产某种具体产品的工厂

实现方式

情景:

使用工厂方法模式,实现一个鞋厂的程序。

定义了鞋子和鞋子工厂的抽象,并实现了雪地鞋和运动鞋两种产品。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
abstract class Shoes {
    abstract String name();
}

public abstract class ShoesFactory {
    abstract Shoes createShoes();
}

class SportShoes extends Shoes {

    @Override
    String name() {
        return "Sport Shoes";
    }
}

class SnowShoes extends Shoes {

    @Override
    String name() {
        return "Snow Shoes";
    }
}

多个具体的工厂

针对每个产品定义一个工厂类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class SportShoesFactory extends ShoesFactory {

    @Override
    SportShoes createShoes() {
        return new SportShoes();
    }
}

class SnowShoesFactory extends ShoesFactory {

    @Override
    SnowShoes createShoes() {
        return new SnowShoes();
    }
}

一个工厂

定义一个工厂类,通过反射实现不同产品的创建

修改抽象工厂:

1
2
3
public abstract class ShoesFactory {
    abstract <T extends Shoes> T createShoes(Class<T> clazz);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class ShangHaiShoesFactory extends ShoesFactory {

    @Override
    <T extends Shoes> T createShoes(Class<T> clazz) {
        try {
            return clazz.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

静态工厂方法

有时能确保只有一种工厂,并不需要创建一个抽象工厂时,可以创建一个普通的工厂类,提供创建对象的方法。

Support the author with
alipay QR Code
wechat QR Code

Yang
WRITTEN BY
Yang
Developer