设计模式------简单工厂模式

    从设计模式的类型上来讲,简单工厂模式是属于建立型模式,又叫作静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定建立出哪种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,能够理解为是不一样工厂模式的一个特殊实现。 html

    下面模拟使用简单工厂模式实现的需求:java

需求:假设如今的咱们须要对数据库中的内容进行输出,须要依赖于一个输出的类,但如今有两种方式进行输出,分别是:excel与word;(这里我简单模拟,所以代码会很简单);数据库

  1. 首先咱们先用写一个输出方式的接口,代码以下:编程

public interface Print
{
    public void outPrint();
}

2.而后须要写出它的两个实现类,以下:
excel方式:设计模式

public class ExcelImpl implements Print
{
    @Override
    public void outPrint()
    {
        System.out.println("使用excel进行导出");
    }
}

word方式:ide

public class WordImpl implements Print
{
    @Override
    public void outPrint()
    {
        System.out.println("使用word进行导出");
    }
}

3.而后实现一个工厂类:this

public class PrintFactory
{
    /**
     * 用于获取print实例的方法
     * */
    public Print getPrint()
    {
        /**
         * 这里默认返回的是excel方式进行导出
         * */
        return new ExcelImpl();
    }
}

4.进行简单工厂方式的实现:编码

public class DataOutput
{
    public static void main(String[] args)
    {
        /**
         * 实例化工厂类
         * */
        PrintFactory printFactory = new PrintFactory();
        /**
         * 实例化调用的类,经过构造方法来对DataOutput对象进行初始化
         * */
        DataOutput dataOutput = new DataOutput(printFactory.getPrint());
        dataOutput.output();
    }
    
    private final Print print;
    
    public DataOutput(Print print)
    {
        this.print = print;
    }
    
    /**
     * 模拟导出,这里就是须要调用其余对象中的方法进行实现
     */
    public void output()
    {
        print.outPrint();
    }
}

好了,接下来咱们只要点击运行就会在控制台出现:使用excel进行导出;
若是因为需求的改变须要使用word来进行导出,很简单,咱们只须要修改工厂类中的方法便可,其余都不须要变:spa

public class PrintFactory
{
    /**
     * 用于获取print实例的方法
     * */
    public Print getPrint()
    {
        /**
         * 这里默认返回的是excel方式进行导出
         * */
        // return new ExcelImpl();
        /**
         * 更改成使用word方式进行导出
         * */
        return new WordImpl();
    }
}

到此咱们已经实现了一个简单工厂模式,咱们可以很明显的感受到该模式的优点:让对象的调用者与对象建立过程进行分离,当对象调用者须要对象时只需直接向工厂请求便可,
从而避免了对象调用者与对象实现类以硬编码方式进行耦合。就如上面的程序,即便Print接口有不少实现类,咱们只须要到工厂类中进行更换实现类的实例化便可,其余不须要设计

更改,这里也显示了面向接口编程的优点,这样对象的调用者就与接口进行耦合而不是与实现类,与接口耦合的好处就是接口能够有多个实现类,保证了咱们能够不去修改接口,

而只是添加或者修改一个实现类便可;

 总结下简单工厂模式:不知道你们有没有发现一个问题就是上面管理实例分配的工厂类中,如今只能每次为其分配一个实例,若是要配置多个实例就须要在工厂类中就行逻辑

判断:

public class PrintFactory
{
    /**
     * 用于获取print实例的方法
     * */
    public Print getPrint(Integer param)
    {
        if(param == 1)
        {
            /**
             * 这里默认返回的是excel方式进行导出
             * */
            return new ExcelImpl();
        }
        else if(param == 2)
        {
            /**
             * 更改成使用word方式进行导出
             * */
            return new WordImpl();
        }
        else
        {
            return null;
        }
        
    }
}

简单工厂模式的有缺点:

优势:该模式的核心就是工厂类,这个类中含有必要的判断逻辑,能够决定在何时建立哪一个产品类的实例。客户端能够免除直接建立产品对象的责任。

缺点:1.工厂类集中了全部产品建立逻辑,造成一个无所不知的全能类,对于这样的类咱们很难进行控制

相关文章
相关标签/搜索