zoukankan      html  css  js  c++  java
  • Java设计模式(3)——抽象工厂模式

      抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

    一、产品族和产品等级结构

      为了方便引进抽象工厂模式,特地引进一个新的概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。每一个产品族中含有产品的数目,与产品等级结构的数目是相等的。产品的等级结构和产品族将产品按照不同方向划分,形成一个二维的坐标系。即相图:

      在上面的相图中加入了具体工厂角色。可以看出,对应于每一个产品族都有一个具体的工厂。而每一个工厂负责创建属于同一个产品族,但是分属不同的等级机构的产品。

    二、模式中包含的角色及其职责

    1.抽象工厂(Creator)角色
      抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
    2.具体工厂( Concrete Creator)角色
      具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
    3.抽象(Product)角色
      抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    4.具体产品(Concrete Product)角色
      抽象模式所创建的具体实例对象
    总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。

    三、Demo

    抽象角色

    产品结构(Apple、Banana)

    public interface Fruit {
        /*
         * 采集
         */
        public void get();
    }
    public abstract class Apple implements Fruit{
        /*
         * 采集
         */
        public abstract void get();
    }
    public abstract class Banana implements Fruit{
        /*
         * 采集
         */
        public abstract void get();
    }

    具体产品角色

    产品族(北方水果)

    public class NorthApple extends Apple {
    
        public void get() {
            System.out.println("采集北方苹果");
        }
    
    }
    public class NorthBanana extends Banana {
    
        public void get() {
            System.out.println("采集北方香蕉");
        }
    
    }

    产品族(南方水果)

    public class SouthApple extends Apple {
    
        public void get() {
            System.out.println("采集南方苹果");
        }
    
    }
    public class SouthBanana extends Banana {
    
        public void get() {
            System.out.println("采集南方香蕉");
        }
    
    }

    抽象工厂角色

    public interface FruitFactory {
        //实例化Apple
        public Fruit getApple();
        //实例化Banana
        public Fruit getBanana();
    }

    具体工厂角色

    public class NorthFruitFactory implements FruitFactory {
    
        public Fruit getApple() {
            return new NorthApple();
        }
    
        public Fruit getBanana() {
            return new NorthBanana();
        }
    
    }
    public class SouthFruitFactory implements FruitFactory {
    
        public Fruit getApple() {
            return new SouthApple();
        }
    
        public Fruit getBanana() {
            return new SouthBanana();
        }
    
    }

    测试类

    public class MainClass {
        public static void main(String[] args) {
            FruitFactory ff = new NorthFruitFactory();
            Fruit apple = ff.getApple();
            apple.get();
            
            Fruit banana = ff.getBanana();
            banana.get();
            
            FruitFactory ff2= new SouthFruitFactory();
            Fruit apple2 = ff2.getApple();
            apple2.get();
            
            Fruit banana2 = ff2.getBanana();
            banana2.get();
            
        }
    }
    View Code

    控制台输出

    采集北方苹果
    采集北方香蕉
    采集南方苹果
    采集南方香蕉

    四、UML类图

  • 相关阅读:
    Unity3D AssetBundle相关
    [转]Unity3D新手引导开发手记
    努力多彩
    js sendBeacon
    js document.activeElement及使用
    js requestAnimationFrame
    js 1+'2' == '1'+'2'
    js scrollIntoViewIfNeeded
    汉字 3个字节
    js 浅拷贝和深拷贝
  • 原文地址:https://www.cnblogs.com/realshijing/p/8410877.html
Copyright © 2011-2022 走看看