• 设计模式(五)抽象工厂(创建型)


    抽象工厂(abstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类。

    适用场合:

    1.一个系统要独立于它的产品的创建、组合和表示时。

    2.一个系统要由多个产品系列中的一个来配置时。

    3.当你强调一系列相关的产品对象的设计以便进行联合使用时。

    4.当你提供一个产品类库,而只想显示他们的接口而不是实现时。

    类图                          

    1

    代码                                                            

    抽象工厂abstractFactory的代码:

    public interface AbstractFactory {
        public ProductA factoryA();
        public ProductB factoryB();
    }

    具体工厂类实现AbstractFactory,用于创建对象。

    public class ConcreteFactory1 implements AbstractFactory {
    
        @Override
        public ProductA factoryA() {
            return new ProductA1();
        }
    
        @Override
        public ProductB factoryB() {
            return new ProductB1();
        }
    
    }
    public class ConcreteFactory2 implements AbstractFactory {
    
        @Override
        public ProductA factoryA() {
            return new ProductA2();
        }
    
        @Override
        public ProductB factoryB() {
            return new ProductB2();
        }
    
    }

    产品A的抽象接口(同理产品B):

    public interface ProductA {
        public void method1();
        public void method2();
    }

    产品A的具体实现(同理产品B):

    public class ProductA1 implements ProductA {
    
        @Override
        public void method1() {
            System.out.println("ProductA1---->method1");
    
        }
    
        @Override
        public void method2() {
            System.out.println("ProductA1---->method2");
    
        }
    
    }
    public class ProductA2 implements ProductA {
    
        @Override
        public void method1() {
            System.out.println("ProductA2---->method1");
    
        }
    
        @Override
        public void method2() {
            System.out.println("ProductA2---->method2");
    
        }
    
    }

    抽象工厂模式的应用代码:

    public class Main {
    
        public static void main(String[] args) {
            AbstractFactory abf1 = new ConcreteFactory1();
            AbstractFactory abf2 = new ConcreteFactory2();
    
            ProductA a1 = abf1.factoryA();
            ProductA a2 = abf2.factoryA();
            ProductB b1 = abf1.factoryB();
            ProductB b2 = abf2.factoryB();
            
            a1.method1();
            a1.method2();
            a2.method1();
            a2.method2();
            b1.method1();
            b1.method2();
            b2.method1();
            b2.method2();
    
        }
    
    }

    工厂方法与抽象工厂的区别                   

    • 工厂方法模式

    一个抽象产品类,可以派生出多个具体产品类。  

    一个抽象工厂类,可以派生出多个具体工厂类。  

    每个具体工厂类只能创建一个具体产品类的实例。

    • 抽象工厂模式

    多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。  

    一个抽象工厂类,可以派生出多个具体工厂类。  

    每个具体工厂类可以创建多个具体产品类的实例。  
       

    • 区别

    工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。  

    工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

    抽象工厂的应用            

    • 抽象工厂模式的使用场景

    抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式,什么意思呢?例如一个文本编辑器和一个图片处理器,都是软件实体,但是*nix下的文本编辑器和WINDOWS下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况,也就是具有了共同的约束条件:操作系统类型,于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

    • 抽象工厂模式的注意实现

    在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要清楚是产品族扩展困难,而不是产品等级,在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可,也就是说横向扩展容易,纵向扩展困难。

    • 最佳实践

    一个模式在什么情况下才能够使用,是很多读者比较困惑的地方,抽象工厂模式是一个简单的模式,使用的场景非常多,大家在软件产品开发过程中,涉及到不同操作系统的时候,都可以考虑使用抽象工厂模式,例如一个应用,需要在三个不同平台上运行:Windows、Linux、Android上运行,你会怎么设计?分别设计三套不同的应用?非也非也,通过抽象工厂模式屏蔽掉操作系统对应用的影响。三个不同操作系统上的软件功能、应用逻辑、UI都应该是非常类似,唯一不同的是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息。

    我是天王盖地虎的分割线

    源代码:http://pan.baidu.com/s/1dD1Qx01

    java抽象工厂.zip

  • 相关阅读:
    MySQL主从复制故障1595报错【原创】
    深入理解计算机系统(3.1)------汇编语言和机器语言
    深入理解计算机系统(2.7)------浮点数舍入以及运算
    深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准
    深入理解计算机系统(2.6)------整数的运算
    深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
    深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
    Spring详解(七)------AOP 注解
    深入理解计算机系统(2.3)------布尔代数以及C语言运算符
    深入理解计算机系统(2.2)------进制间的转换原理
  • 原文地址:https://www.cnblogs.com/yydcdut/p/3856199.html
Copyright © 2020-2023  润新知