工厂方法模式

南笙酒味 提交于 2020-03-07 03:03:16

目录

概念

实现原理

解决的问题

作用和意义

角色构成

抽象工厂(Creator)角色

具体工厂(Concrete Creator)角色

抽象产品(Product)角色

具体产品(Concrete Product)角色

UML类图

代码实现

抽象工厂

IPressFactory.java

具体工厂 

HarvardPressFactory.java

OxfordPressFactory.java

抽象产品

IBook.java

具体产品 

HongLouBook.java

SanGuoBook.java

 客户端调用

FactoryMethodFirstDemo.java

工厂方法模式-控制台输出 


概念

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

实现原理

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

解决的问题

工厂方法模式是简单工厂模式的衍生或者说改进,解决了简单工厂模式存在的问题,友好地遵循了开闭原则,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

作用和意义

工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

角色构成

工厂方法模式是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

抽象工厂(Creator)角色

是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

具体工厂(Concrete Creator)角色

这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

抽象产品(Product)角色

工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口

具体产品(Concrete Product)角色

这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

UML类图

代码实现

抽象工厂

IPressFactory.java

package pattern.factory.factorymethod.factorymethod1.factoryinterface;

import pattern.factory.factorymethod.factorymethod1.productinterface.IBook;

/**
 * 〈一句话功能简述〉抽象工厂角色<br>
 * 〈功能详细描述〉给具体工厂实现用的
 *
 * @author 刘斌
 * @date 2020/3/1
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public interface IPressFactory {
    /**
     * 获取书籍信息
     *
     * @return 书籍
     */
    IBook getBookInfo();
}

具体工厂 

HarvardPressFactory.java

package pattern.factory.factorymethod.factorymethod1.factoryimpl;

import pattern.factory.factorymethod.factorymethod1.factoryinterface.IPressFactory;
import pattern.factory.factorymethod.factorymethod1.productimpl.HongLouBook;
import pattern.factory.factorymethod.factorymethod1.productinterface.IBook;

/**
 * 〈一句话功能简述〉哈佛大学出版社(相当于一个工厂,出版社是发行和生产书的工厂)<br>
 * 〈功能详细描述〉具体工厂角色
 *
 * @author 刘斌
 * @date 2020/3/1
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class HarvardPressFactory implements IPressFactory {
    @Override
    public IBook getBookInfo() {
        return new HongLouBook();
    }
}

OxfordPressFactory.java

package pattern.factory.factorymethod.factorymethod1.factoryimpl;

import pattern.factory.factorymethod.factorymethod1.factoryinterface.IPressFactory;
import pattern.factory.factorymethod.factorymethod1.productimpl.SanGuoBook;
import pattern.factory.factorymethod.factorymethod1.productinterface.IBook;

/**
 * 〈一句话功能简述〉牛津大学出版社(相当于一个工厂,出版社是发行和生产书的工厂)<br>
 * 〈功能详细描述〉具体工厂角色
 *
 * @author 刘斌
 * @date 2020/3/1
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class OxfordPressFactory implements IPressFactory {
    @Override
    public IBook getBookInfo() {
        return new SanGuoBook();
    }
}

抽象产品

IBook.java

package pattern.factory.factorymethod.factorymethod1.productinterface;

/**
 * 〈一句话功能简述〉抽象产品角色<br>
 * 〈功能详细描述〉给具体产品实现用的
 *
 * @author 刘斌
 * @date 2020/3/1
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public interface IBook {
    /**
     * 名称
     * @return 书名
     */
    String name();
    /**
     * 地址
     * @return 书价格
     */
    double price();
}

具体产品 

HongLouBook.java

package pattern.factory.factorymethod.factorymethod1.productimpl;

import pattern.factory.factorymethod.factorymethod1.productinterface.IBook;

/**
 * 〈一句话功能简述〉红楼梦(具体的一本书,相当于具体的一个产品)<br>
 * 〈功能详细描述〉具体产品角色
 *
 * @author 刘斌
 * @date 2020/3/1
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class HongLouBook implements IBook {
    @Override
    public String name() {
        return "书名:红楼梦";
    }

    @Override
    public double price() {
        return 30;
    }
}

SanGuoBook.java

package pattern.factory.factorymethod.factorymethod1.productimpl;

import pattern.factory.factorymethod.factorymethod1.productinterface.IBook;

/**
 * 〈一句话功能简述〉三国演义(具体的一本书,相当于具体的一个产品)<br>
 * 〈功能详细描述〉具体产品角色
 *
 * @author 刘斌
 * @date 2020/3/1
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class SanGuoBook implements IBook {
    @Override
    public String name() {
        return "三国演义";
    }

    @Override
    public double price() {
        return 40;
    }
}

 客户端调用

FactoryMethodFirstDemo.java

package pattern.factory.factorymethod.factorymethod1;

import pattern.factory.factorymethod.factorymethod1.factoryimpl.HarvardPressFactory;
import pattern.factory.factorymethod.factorymethod1.factoryimpl.OxfordPressFactory;
import pattern.factory.factorymethod.factorymethod1.factoryinterface.IPressFactory;
import pattern.factory.factorymethod.factorymethod1.productinterface.IBook;

/**
 * 〈一句话功能简述〉工厂方法模式:客户端调用<br>
 * 〈功能详细描述〉
 *
 * @author 刘斌
 * @date 2020/3/1
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class FactoryMethodFirstDemo {
    public static void main(String[] args) {
        IPressFactory harvardPressFactory = new HarvardPressFactory();
        IBook book1 = harvardPressFactory.getBookInfo();
        System.out.println(book1.name() + ", 价格:" + book1.price());
        System.out.println("=============================");
        IPressFactory oxfordPressFactory = new OxfordPressFactory();
        IBook book2 = oxfordPressFactory.getBookInfo();
        System.out.println(book2.name() + ", 价格:" + book2.price());
    }
}

工厂方法模式-控制台输出 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!