• 设计模式04 抽象工厂模式


    先直观对比一下抽象工厂模式(上图),与工厂方法模式(下图)的UML类图的区别。可以看出:

    工厂方法模式是一个工厂接口,即多个工厂生产一种(等级)产品;

    而抽象工厂模式是多个工厂接口,多个工厂生产多种(等级)产品。

    抽象工厂模式(AbstractFactory)定义:提供一个称为抽象工厂的接口,其每一个实现类,可以创建一组(品牌)产品。无需知道被创建的产品的具体类型,就可以得到同品牌不同类型的产品。

    举例来说:有一个抽象工厂接口,有两个厂家:HuaWei和Apple实现了这个接口。可以生产两种产品智能手机和平板电脑。

    在使用抽象工厂模式后,可以分别得到:华为手机、华为平板、苹果手机、苹果平板,共4类具体的产品。

    抽象工厂接口与实现类:

     1 public interface AbstractFactory {
     2     public Product1 newProduct1();
     3     public Product2 newProduct2();
     4 }
     5 
     6 //华为
     7 public class ConcreteFactory1 implements AbstractFactory {
     8     //华为手机
     9     @Override
    10     public Product1 newProduct1()
    11     {
    12         System.out.println("华为品牌-->智能手机");
    13         return new ConcreteProduct11();
    14     }
    15     //华为平板
    16     @Override
    17     public Product2 newProduct2()
    18     {
    19         System.out.println("华为品牌-->平板电脑");
    20         return new ConcreteProduct21();
    21     }
    22 }
    23 
    24 //苹果
    25 public class ConcreteFactory2 implements AbstractFactory {
    26     //苹果手机
    27     @Override
    28     public Product1 newProduct1() {
    29         System.out.println("苹果品牌-->智能手机");
    30         return new ConcreteProduct12();
    31     }
    32     
    33     //苹果平板
    34     @Override
    35     public Product2 newProduct2() {
    36         System.out.println("苹果品牌-->平板电脑");
    37         return new ConcreteProduct22();
    38     }
    39 }

    抽象产品1与其实现类:

     1 //手机
     2 public abstract class Product1 {
     3 
     4 }
     5 
     6 //手机-华为生产
     7 public class ConcreteProduct11 extends Product1 {
     8 
     9 }
    10 
    11 //手机-苹果生产
    12 public class ConcreteProduct12 extends Product1 {
    13 
    14 }

    抽象产品2与其实现类:

     1 //平板
     2 public abstract class Product2 {
     3 
     4 }
     5 
     6 //平板-华为生产
     7 public class ConcreteProduct21 extends Product2 {
     8 
     9 }
    10 
    11 //平板-苹果生产
    12 public class ConcreteProduct22 extends Product2 {
    13 
    14 }

    调用方式:

    1 public class Client {
    2     public static void main(String[] args) {
    3         //创建一个[苹果品牌 ->平板电脑]对象
    4         AbstractFactory factory = new ConcreteFactory2();
    5         Product2 product = factory.newProduct2();
    6     }
    7 }

    执行结果:

  • 相关阅读:
    tyvj1463 智商问题
    P1070 道路游戏
    P1862 输油管道问题
    P1875 佳佳的魔法药水
    P1498 南蛮图腾
    P1489 猫狗大战
    P1395 会议(求树的重心)
    P2285 [HNOI2004]打鼹鼠
    P3819 松江1843路(洛谷月赛)
    P3818 小A和uim之大逃离 II(洛谷月赛)
  • 原文地址:https://www.cnblogs.com/asenyang/p/12111025.html
Copyright © 2020-2023  润新知