zoukankan      html  css  js  c++  java
  • 五:抽象方法模式

     抽象工厂模式:算是工厂相关模式的终极形态,如果各位完全理解了上一章的工厂方法模式,那么抽象工厂模式就很好理解了。它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品。这其实是工厂方法模式的一种扩展不是吗?

     定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

    下面我们来看看抽象工厂模式的类图。

    我们对比下刚才的定义,LZ给各位分析下上面的类图,首先刚才说了,我们要创建一个接口,这个接口就是指的Creator,而一组相关或者相互依赖的对象,就是指的ProductA和ProductB以及它们具体的实现类,而上面又提到说不是返回的具体的类,所以我们返回的应该是接口或者抽象类,那么在上述类图当中,则是指的ProductA和ProductB接口。

    下面LZ将上述类图诠释成容易理解的JAVA代码,供各位参考。

    首先给出我们的产品族,也就是类图中右半部分。

    复制代码
    package net;
    
    interface ProductA {
    
        void methodA();
    }
    
    interface ProductB {
        
        void methodB();
    }
    
    class ProductA1 implements ProductA{
    
        public void methodA() {
            System.out.println("产品A系列中1型号产品的方法");
        }
        
    }
    
    class ProductA2 implements ProductA{
    
        public void methodA() {
            System.out.println("产品A系列中2型号产品的方法");
        }
        
    }
    
    class ProductB1 implements ProductB{
    
        public void methodB() {
            System.out.println("产品B系列中1型号产品的方法");
        }
        
    }
    
    class ProductB2 implements ProductB{
    
        public void methodB() {
            System.out.println("产品B系列中2型号产品的方法");
        }
        
    }
    复制代码

                结构比较清晰,下面是类图中左半部分,首先给出工厂接口。

    复制代码
    package net;
    
    public interface Creator {
    
        ProductA createProductA();
        
        ProductB createProductB();
        
    }
    复制代码

                下面是两个具体的工厂实现类。

    复制代码
    package net;
    
    public class ConcreteCreator1 implements Creator{
    
        public ProductA createProductA() {
            return new ProductA1();
        }
    
        public ProductB createProductB() {
            return new ProductB1();
        }
    
    }
    package net;
    
    public class ConcreteCreator2 implements Creator{
    
        public ProductA createProductA() {
            return new ProductA2();
        }
    
        public ProductB createProductB() {
            return new ProductB2();
        }
    
    }
    复制代码

                这样我们的类图代码就实现完毕,下面我们写一个测试类,去调用一下,感受一下抽象工厂模式的客户端调用方式。

    复制代码
    package net;
    
    
    public class Client {
    
        public static void main(String[] args) throws Exception {
            Creator creator = new ConcreteCreator1();
            ProductA productA = creator.createProductA();
            ProductB productB = creator.createProductB();
            productA.methodA();
            productB.methodB();
            
            creator = new ConcreteCreator2();
            productA = creator.createProductA();
            productB = creator.createProductB();
            productA.methodA();
            productB.methodB();
        }
    }
    复制代码

                在过程当中,我们切换过一次工厂实现类,而下面的代码是一模一样的,但是我们使用的就是另一套产品实现体系了,我们看运行结果。

      有关工厂的三个模式到这里就全部介绍完了,三者有着很大的关联和明显的关系,要想灵活运用这三种设计模式,还是要彻底理解它们所针对的问题以及三者的关系。下面罗列下这三种设计模式依次进化的原因。

     1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。

    2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。

  • 相关阅读:
    用户登录系统(三)
    SQL server 2005 时间函数应用 查询出结果为00:00:00 小时、分钟、秒
    Windows Server 2003系统 常用操作技巧集绵,发现了继续添加
    新一代井下数字集群通讯系统需求分析(一)
    WPF学习笔记(一)
    建立一个VSS源代码管理服务器,下面介绍建立的过程与实际应用情况
    Vista下使用VS2005的时候提示"没有安装FrontPage服务器扩展"的问题。
    SQL语句导入/导出EXCEL(转载自:白袜子blog)
    sql2005"因为它正用于复制"的错误解决办法
    (转)CS0016: 未能写入输出文件“c:\WINDOWS\xxxxxsktsuj.dll”“拒绝访问。”的处理
  • 原文地址:https://www.cnblogs.com/lgg20/p/11081975.html
Copyright © 2011-2022 走看看