设计模式之工厂模式 ( Factory Pattern )


简单工厂模式 ( Simple Factory )

  • 简单工厂模式又称为 静态工厂方法模式(Static Factory Method Pattern); 工厂模式 主要是为创建对象提供过渡接口,一个工厂决定创建出哪一种产品类的实例,以便 将创建对象的具体过程屏蔽隔离起来, 达到提高扩散性,灵活性的目的

一、概述

优点

  • 简洁代码,将创建实例化和初始化与使用实例分开
  • 提高程序的扩展性和尽量少的修改量

缺点

  • 需要多做一些工作,如抽取接口,创建工厂类
  • 当需要添加具体产品对象时,需要改动工厂类的源代码,不易于扩展过于复杂的产品结构,对开 - 闭原则支持不够
  • 当拥有很多具体产品对象时,在其之间又存在复杂的层次关系,这个类必须添加复杂的逻辑判断,导致维护困难
  • 整个系统严重依赖工厂类,只要工厂类出现问题,那么整个系统就不能工作了

二、简单工厂模式结构

类图

在这里插入图片描述

结构说明

角色 说明
抽象产品角色(Product) 它一般是具体产品继承的父类或者实现的接口,在 Java 中由接口或者抽象类来实现
具体产品角色(Concrete Product) 工厂类所创建的对象就是此角色的实例,在 Java 中由一个具体类来实现
工厂类角色(Creator) 简单工厂核心,含有一定的商业逻辑和判断逻辑,在 Java 中一般由具体类来实现

三、代码演示

抽象产品角色(Product):

/**
 * @Author: Caojun
 * @Description: 产品接口:抽象产品角色 Product
 * @Create: 2020-01-19 23:10
 */
public interface Product {

    /**
     * 设计产品
     */
    void design();

    /**
     * 加工产品
     */
    void processed();

    /**
     * 销售产品
     */
    void sale();
}

具体产品角色(Concrete Product):

/**
 * @Author: CaoJun
 * @Description: 手机产品:具体产品角色 Concrete Product
 * @Create: 2020-01-19 23:12
 **/
public class PhoneProduct implements Product {

    @Override
    public void design() {
        System.out.println("设计手机产品");
    }

    @Override
    public void processed() {
        System.out.println("加工手机产品");
    }

    @Override
    public void sale() {
        System.out.println("销售手机产品");
    }
}
/**
 * @Author: CaoJun
 * @Description: IPad 产品:具体产品角色 Concrete Product
 * @Create: 2020-01-19 23:14
 **/
public class IPadProduct implements Product {

    @Override
    public void design() {
        System.out.println("设计 IPad 产品");
    }

    @Override
    public void processed() {
        System.out.println("加工 IPad 产品");
    }

    @Override
    public void sale() {
        System.out.println("销售 IPad 产品");
    }
}

工厂类角色(Creator):

/**
 * @Author: CaoJun
 * @Description: 产品工厂:工厂类角色 Creator
 * @Create: 2020-01-19 23:15
 **/
public class ProductFactory {

    public static Product create(Class clazz) {
        if (clazz != null) {
            try {
                return (Product) clazz.newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

客户端测试:

/**
 * @Author: CaoJun
 * @Description: 客户端测试简单工厂模式
 * @Create: 2020-01-19 23:16
 **/
public class Client {
    public static void main(String[] args) {
        Product product = ProductFactory.create(IPadProduct.class);
        product.design();
        product.processed();
        product.sale();
    }
}

工厂方法模式 ( Factory Method )

工厂方法模式又称为 多态性工厂模式(Polymorphic Factory), 其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

一、概述


工厂方法与简单工厂

  • 简单工厂模式: 工厂类处于产品类实例化的中心位置,当有新的产品类加入系统的时候,必须修改工厂类的逻辑
  • 工厂方法模式: 核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类实现,不再接触产品创建的细节

优点

  • 使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的 上帝类,分担了对象承担的压力
  • 结构更加的灵活,当有新的产品时,只需要再添加一个具体角色和具体工厂角色即可,不必修改已有的代码,符合开闭原则

缺点

  • 当面对的产品有复杂的等级结构的时候,可能会有成百上千个类,容易产生类爆炸,难以维护
  • 产生了更多的对象,增加工作量

二、简单工厂模式结构

类图

在这里插入图片描述

结构说明

角色 说明
抽象产品角色(Product) 工厂方法模式所创建对象的超类型,产品对象共同的抽象父类或共同拥有的接口。
具体产品角色(Concrete Product) 工厂类所创建的对象就是此角色的实例,在 Java 中由一个具体类实现
抽象工厂角色(Creator) 工厂方法模式的核心与应用程序无关,创建对象的工厂类须实现此接口
具体工厂角色(Concrete Creator) 实现抽象工厂,该角色含有与应用密切相关的逻辑,并且被应用程序调用创建产品对象

三、代码演示

抽象产品角色(Product):

/**
 * @Author: Caojun
 * @Description: 产品接口:抽象产品角色 Product
 * @Create: 2020-01-19 23:10
 */
public interface Product {

    /**
     * 设计产品
     */
    void design();

    /**
     * 加工产品
     */
    void processed();

    /**
     * 销售产品
     */
    void sale();

}

具体产品角色(Concrete Product):

/**
 * @Author: CaoJun
 * @Description: 手机产品:具体产品角色 Concrete Product
 * @Create: 2020-01-19 23:12
 **/
public class PhoneProduct implements Product {

    @Override
    public void design() {
        System.out.println("设计手机产品");
    }

    @Override
    public void processed() {
        System.out.println("加工手机产品");
    }

    @Override
    public void sale() {
        System.out.println("销售手机产品");
    }
}
/**
 * @Author: CaoJun
 * @Description: IPad 产品:具体产品角色 Concrete Product
 * @Create: 2020-01-19 23:14
 **/
public class IPadProduct implements Product {

    @Override
    public void design() {
        System.out.println("设计 IPad 产品");
    }

    @Override
    public void processed() {
        System.out.println("加工 IPad 产品");
    }

    @Override
    public void sale() {
        System.out.println("销售 IPad 产品");
    }
}

抽象工厂角色(Creator):

/**
 * @Author: CaoJun
 * @Description: 产品工厂接口:抽象工厂角色 Creator
 * @Create: 2020-01-19 23:42
 **/
public interface ProductFactory {

    Product create();
}

具体工厂角色(Concrete Creator):

/**
 * @Author: CaoJun
 * @Description: 手机工厂:具体工厂角色 Concrete Creator
 * @Create: 2020-01-19 23:43
 **/
public class PhoneFactory implements ProductFactory {

    @Override
    public Product create() {
        return new PhoneProduct();
    }
}
/**
 * @Author: CaoJun
 * @Description: IPad 工厂:具体工厂角色 Concrete Creator
 * @Create: 2020-01-19 23:43
 **/
public class IpadFactory implements ProductFactory {

    @Override
    public Product create() {
        return new IPadProduct();
    }
}

客户端测试:

/**
 * @Author: CaoJun
 * @Description: 客户端测试工厂方法模式
 * @Create: 2020-01-19 23:44
 **/
public class Client {
    public static void main(String[] args) {
        ProductFactory  factory = new PhoneFactory();
        Product product = factory.create();
        product.design();
        product.processed();
        product.sale();
    }
}

抽象工厂模式 ( Abstract Factory )

抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端不必指定具体产品的情况下创建多个产品族中的产品对象,不用知道如何被创建、实现等细节。

一、概述


优点

  • 采用分类的形式,更好地管理不同类型的产品(多个抽象产品角色)
  • 解决了工厂方法模式的类爆炸问题

缺点

  • 产生产品族,但不利于产生新的产品,需要少量修改工厂类已有的代码
  • 组织结构更加复杂、不利于理解

二、简单工厂模式结构

类图

在这里插入图片描述

结构说明

角色 说明
抽象产品角色(Product) 工厂方法模式所创建对象的超类型,产品对象共同的抽象父类或共同拥有的接口。
具体产品角色(Concrete Product) 工厂类所创建的对象就是此角色的实例,在 Java 中由一个具体类实现
抽象工厂角色(Creator) 工厂方法模式的核心与应用程序无关,创建对象的工厂类须实现此接口
具体工厂角色(Concrete Creator) 实现抽象工厂,该角色含有与应用密切相关的逻辑,并且被应用程序调用创建产品对象

三、代码演示

抽象产品角色(Product):

/**
 * @Author: CaoJun
 * @Description: 水果接口:抽象产品角色 Product
 * @Create: 2020-01-20 00:17
 */
public interface Fruit {
    void plant();
}
/**
 * @Author: CaoJun
 * @Description: 蔬菜接口:抽象产品角色 Product
 * @Create: 2020-01-20 00:17
 */
public interface Veggie {
    void plant();
}

具体产品角色(Concrete Product):

/**
 * @Author: CaoJun
 * @Description: 北方水果:具体产品角色 Concrete Product
 * @Create: 2020-01-20 00:03
 */
public class NorthenFruit implements Fruit {
    private String name;

    public NorthenFruit(String name) {
        this.name = name;
    }

    @Override
    public void plant() {
        System.out.println("种植:" + this.name);
    }
}
/**
 * @Author: CaoJun
 * @Description: 南方蔬菜: 具体产品角色 Concrete Product
 * @Create: 2020-01-20 00:03
 */
public class NorthenVeggie implements Veggie {
    private String name;

    public NorthenVeggie(String name) {
        this.name = name;
    }

    @Override
    public void plant() {
        System.out.println("种植:" + this.name);
    }
}
/**
 * @Author: CaoJun
 * @Description: 热带水果:具体产品角色 Concrete Product
 * @Create: 2020-01-20 00:03
 **/
public class TropicalFruit implements Fruit {
    private String name;

    public TropicalFruit(String name) {
        this.name = name;
    }

    @Override
    public void plant() {
        System.out.println("种植:" + this.name);
    }
}
/**
 * @Author: CaoJun
 * @Description: 热带蔬菜: 具体产品角色 Concrete Product
 * @Create: 2020-01-20 00:03
 **/
public class TropicalVeggie implements Veggie {
    private String name;

    public TropicalVeggie(String name) {
        this.name = name;
    }

    @Override
    public void plant() {
        System.out.println("种植:" + this.name);
    }
}

抽象工厂角色(Creator):

/**
 * @Author: CaoJun
 * @Description: 蔬菜接口:抽象工厂角色 Creator
 * @Create: 2020-01-20 00:17
 */
public interface Veggie {
    void plant();
}

具体工厂角色(Concrete Creator):

/**
 * @Author: CaoJun
 * @Description: 北方工厂:具体工厂角色 Concrete Creator
 * @Create: 2020-01-20 00:09
 **/
public class NorthenGardener implements Gardener {

    @Override
    public Fruit createFruit(String name) {
        return new NorthenFruit(name);
    }

    @Override
    public Veggie createVeggie(String name) {
        return new NorthenVeggie(name);
    }
}
/**
 * @Author: CaoJun
 * @Description: 热带工厂:具体工厂角色 Concrete Creator
 * @Create: 2020-01-20 00:10
 **/
public class TropicalGardener implements Gardener {

    @Override
    public Fruit createFruit(String name) {
        return new TropicalFruit(name);
    }

    @Override
    public Veggie createVeggie(String name) {
        return new TropicalVeggie(name);
    }
}

客户端测试:

/**
 * @Author: CaoJun
 * @Description: 客户端测试抽象工厂模式
 * @Create: 2020-01-20 00:12
 **/
public class Client {
    public static void main(String[] args) {
        NorthenGardener northenGardener = new NorthenGardener();
        northenGardener.createFruit("苹果").plant();
        northenGardener.createVeggie("白菜").plant();
    }
}
发布了17 篇原创文章 · 获赞 3 · 访问量 547

猜你喜欢

转载自blog.csdn.net/weixin_38251871/article/details/104046721