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,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。

  • 相关阅读:
    打包时内容过多,node 报错:内存溢出 javascript heap out of memory
    css样式-旋转rotate
    移动端相关事件
    input文本框的事件
    vue项目在IE11下报错Promise未定义
    解疑常用
    table-layout
    7.24 每日学习作业总结概括
    7.23 每日学习作业总结
    控制流程之while循环
  • 原文地址:https://www.cnblogs.com/lgg20/p/11081975.html
Copyright © 2011-2022 走看看