设计模式之工厂模式

概述

工厂方法模式是创建型设计模式的一种,定义一个用于创建对象的接口,让子类决定实例化那个类,工厂方法使一个类的实例化延迟到其子类
工厂方法模式也叫工厂模式或虚拟构造器模式,在工厂方法模式中,一个工厂父类包含多个工厂子类,父类定义接口,子类负责创建具体的产品对象.

UML

  • 抽象工厂(Creator) : 工厂方法模式的核心
  • 具体工厂(ConcreateCreator) : 实现了具体的业务逻辑
  • 抽象产品(Product) : 工厂方法模式所创建的产品的父类
  • 具体产品(ConcreateProduct) : 实现抽象产品的某个具体产品对象

使用场景

  • 在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式

实例

工厂方法模式分为三种,普通工厂模式,多个工厂方法模式,静态工厂方法模式,其实在工厂方法模式中还有一种特例,叫做简单工厂模式(或者静态工厂方法模式),
静态工厂模式是Effective Java第一条推荐的创建对象的方式,静态工厂方法常见于我们的工具类,如TextUtil等,

普通工厂模式实例代码

//抽象产品
public interface Product {
}

//具体产品类
//具体产品类
public class ConcreteProductA implements Product {

    public ConcreteProductA() {
        System.out.println("method: -->我是具体的产品A");
    }

}

public class ConcreteProductB implements Product {

    public ConcreteProductB() {
        System.out.println("method: -->我是具体的产品B");
    }

}

// 抽象工厂类
public abstract class Factory {
    public abstract Product createProduct();
}

// 具体工厂类
public class ConcreteFactory extends Factory {
    @Override public Product createProduct() {
        return new ConcreteProductA();
    }
}

//客户端调用代码
public class Test {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        Product product = factory.createProduct();

    }
}

多个工厂方法模式

多个方法工厂模式是普通工厂方法模式的升级版,就是工厂中提供多个方法

public class MoreMethodConcreteFactory extends MoreMethodFactory {

    @Override
    public  Product createProducA() {
        return new ConcreteProductA();
    }

    @Override
    public Product createProductB() {
        return new ConcreteProductB();
    }
}

静态工厂方法模式

在多个工厂方法模式的基础上进一步改造

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

    public static Product createProductB(){
        return new ConcreteProductB();
    }
}

这样的话,客户端的调用就不需要创建工厂对象了

Product productA = StaticFactory.createProductA();

Product productB = StaticFactory.createProductB();

优缺点

优点

  • 良好的封装性和清晰的代码结构,不需要知道对象的创建过程,降低模块间的耦合.
  • 优秀的拓展性,如果需要增加产品,只需要拓展一个工厂类即可,很好的拥抱了变化.
  • 屏蔽产品类,产品类的任何变化,客户端都不需要关心,只需要关注产品接口即可.
  • 解耦,高层模块只需要知道产品的抽象类,不需要关心其实现

缺点

  • 结构复杂化,每次添加新产品时,都需要编写一个新的产品类.同时还要引入其抽象层,导致结构变得复杂,因此在特定场景是否使用工厂方法模式还需设计者权衡利弊了
  • 一个工厂只能创建一种产品.

see source code

原文地址:https://www.cnblogs.com/Dyleaf/p/8507023.html