设计模式之工厂方法模式

SPPan 2019-04-03 设计模式 74人已围观

工厂方法模式(Factory Method Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂方法模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂方法模式分为三种:

1、简单工厂方法模式

2、多个工厂方法模式

3、静态工厂方法模式

1 介绍

1.1 主要解决的问题

主要解决接口选择的问题。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

1.2 优点

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

1.3 缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得代码量成倍增加,在一定程度上增加了系统的复杂度。

2 角色

2.1 Product:抽象产品角色

抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。

public interface Product {
    void attr();
}

2.2 ProductXXX:具体产品角色

具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

public class ProductA implements Product {

    @Override
    public void attr() {
        System.out.println("ProductA.attr");
    }
}

public class ProductB implements Product {

    @Override
    public void attr() {
        System.out.println("ProductB.attr");
    }
}

2.3 Factory:工厂角色

工厂角色负责实现创建所有实例的内部逻辑。

3 实现

3.1 简单工厂方法模式

建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

3.1.1 结构图

简单工厂模式结构图

3.1.2 工厂角色

只有一个工厂,并且只有一个生产方法,根据传入不同的参数,生产不同的产品。

class SimpleFactory {
    public Product produce(Class typeClazz) throws Exception {
        if (typeClazz == ProductA.class) {
            return new ProductA();
        }
        if (typeClazz == ProductB.class) {
            return new ProductB();
        }
        throw new Exception("unknown type to produce");
    }
}

3.1.3 客户端

先创建工厂对象实例,调用生产方法得到对应的产品。

public class SimpleFactoryMethod {
    public static void main(String[] args) {
        try {
            SimpleFactory factory = new SimpleFactory();
            Product produce = factory.produce(ProductB.class);
            produce.attr();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3.2 多个工厂方法模式

多个工厂方法模式是对普通工厂方法模式的改进,在普通工厂方法模式中,创建对象的时候需要给工厂指定创建的类型,这是非常不方便的。而多个工厂方法模式是提供多个工厂方法,可以分别创建对象。

3.2.1 结构图

多工厂方法模式结构图

3.2.2 工厂角色

一个工厂类,每个产品一个工厂方法来生产对应的产品。

class MultiFactory {
    public Product produceDog() {
        return new ProductB();
    }

    public Product produceCat() {
        return new ProductA();
    }
}

3.2.3 客户端调用

需要先创建工厂实例,然后调用需要的产品的工厂方法生产对应的产品。

public class MultiFactoryMethod {

    public static void main(String[] args) {
        MultiFactory factory = new MultiFactory();

        Product cat = factory.produceCat();
        cat.attr();

        Product dog = factory.produceDog();
        dog.attr();
    }
}

3.3 静态工厂方法模式

静态工厂方法模式是对多个工厂方法模式的改进,多个工厂方法存在一个问题,每次想要创建对象都需要先创建工厂类的实例。静态工厂方法模式通过将工厂方法设置成静态方法,从而省去了频繁创建工厂类实例的步骤。

3.3.1 结构图

结构和多方法工厂模式一致,只是方法改成了静态方法。

静态工厂方法模式结构图

3.3.2 工厂角色

一个工厂类,每个产品一个静态工厂方法来生产对应的产品。

class StaticFactory {
    public static Product produceA() {
        return new produceA();
    }

    public static Product produceB() {
        return new produceB();
    }
}

3.3.3 客户端调用

不需要创建工厂的实例,直接通过静态方法调用需要生成的产品对应的工厂方法即可。

public class StaticFactoryMethod {

    public static void main(String[] args) {
        Product a = StaticFactory.produceA();
        a.attr();

        Product b = StaticFactory.produceB();
        b.attr();
    }
}

吐槽(0)

文章评论

    共有0条评论

文章目录