• 设计模式之工厂方法模式与抽象工厂模式


    在上一篇关于设计模式的博客:http://www.cnblogs.com/shenliang123/archive/2012/05/10/2494412.html  已经说到了这个问题:就是如何让工厂类来更好的处理不同实例的返回即使用另外一种思路来代替在一个工厂类中进行逻辑判断以返回不同的对象实例;

    解决的方案就是今天要介绍的:工厂方法模式与抽象工厂模式

    该设计模式的设计:就是提供多个工厂类,有多少个实现类就提供多少个工厂类;依照前面的思路,我们这里又需要面向接口进行编写了;

    还是上次那个Print实例:

    首先上次那个例子中有两个实现类分别是:ExcelImpl与WordImpl;因此安装工厂方法的设计模式,我们需要提供两个工厂类;

    按照面向接口编程:我们需要首先为所有的工厂类提供一个接口:

    PrintFactoryInterface:

    package xidian.sl.interfaces;
    
    public interface PrintFactoryInterface {
        public Print getPrint();
    }

    然后是两个实现类:ExcelFactory

    package xidian.sl.impl;
    
    import xidian.sl.interfaces.Print;
    import xidian.sl.interfaces.PrintFactoryInterface;
    
    public class ExcelFactory implements PrintFactoryInterface{
    
        @Override
        public Print getPrint() {
            // TODO Auto-generated method stub
            return new ExcelImpl();
        }
    
    }

    WordFactory:

    package xidian.sl.impl;
    
    import xidian.sl.interfaces.Print;
    import xidian.sl.interfaces.PrintFactoryInterface;
    
    public class WordFactory implements PrintFactoryInterface {
    
        @Override
        public Print getPrint() {
            // TODO Auto-generated method stub
            return new WordImpl();
        }
    
    }

    调用者代码:

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

    看下上面的代码可以发现与简单工厂模式的区别是:现在调用者需要更改不同的实现类只需要更换PrintFactoryInterface printFactory = new ExcelFactory();来实例化不
    同的工厂类即可,这样保证了每个工厂类只负责一个实例类,但这样却出现了另外一个问题就是工厂类与调用者的耦合;

    抽象工厂模式就是用来解决工厂类与调用者之间耦合的问题:先直接来看对应的抽象工厂类的代码:

    package xidian.sl.interfaces;
    
    import xidian.sl.impl.ExcelFactory;
    import xidian.sl.impl.WordFactory;
    
    public class PrintFactoryFactory {
        /**
         * 下面只定义一个方法来返回相应的工厂类
         * */
        public static PrintFactoryInterface getFactory(String type){
            //equalsIgnoreCase进行比较时不会考虑大小写
            if("better".equalsIgnoreCase(type)){
                return new ExcelFactory();
            }else{
                return new WordFactory();
            }
        }
    
    }

    大家可能发现了这个抽象工厂类跟上一节中讲的工厂类很像,只是返回的对象不一样,抽象工厂类是管理工厂类的,返回的也是工厂类实例而工厂类是管理被调用实例的,故返回的
    也是被调用实例;

    调用代码变为:

    package xidian.sl.impl;
    
    import xidian.sl.interfaces.Print;
    import xidian.sl.interfaces.PrintFactory;
    import xidian.sl.interfaces.PrintFactoryFactory;
    import xidian.sl.interfaces.PrintFactoryInterface;
    
    public class DataOutput {
        private Print print;
        
        public DataOutput(Print print){
            this.print = print;
        }
        /**
         * 模拟导出,这里就是需要调用其他对象中的方法进行实现
         * */
        public void output(){
            print.outPrint();
        }
        
        public static void main(String[] args){
            /**
             * 实例化工厂类
             * */
            //PrintFactory printFactory = new PrintFactory();
            //PrintFactoryInterface printFactory = new ExcelFactory();
            PrintFactoryInterface printFactory = PrintFactoryFactory.getFactory("better");
            /**
             * 实例化调用的类,通过构造方法来对DataOutput对象进行初始化
             * */
            DataOutput dataOutput = new DataOutput(printFactory.getPrint());
            dataOutput.output();
        }
    }

    工厂模式就解析到此

    希望多多交流,多多关注,共同成就梦想
  • 相关阅读:
    如何在 SQLServer 中启用 xp_cmdshell 等
    强力解决使用node版本管理工具 NVM 出现的问题(找不到 node,或者找不到 npm)
    [啃书] 预告篇
    [啃书] 第5篇
    [啃书] 第4篇
    [啃书] 第3篇
    [啃书] 第2篇
    [啃书] 第1篇
    [前端随笔][Vue] 多级菜单实现思路——组件嵌套
    [算法小练][图][拓扑排序+深度优先搜索] 平板涂色问题
  • 原文地址:https://www.cnblogs.com/shenliang123/p/2494826.html
Copyright © 2020-2023  润新知