• 第六讲、抽象工厂模式


    1.定义

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

    2.产品族和产品等级结构

    3.模式中包含的角色及其职责

    • 抽象工厂角色(Creator)-- 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口
    • 具体工厂角色(Concrete Creator)-- 具体工厂类是抽象工厂的一个实现,负责实现某个产品族中的产品对象
    • 抽象角色(Product)-- 抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口
    • 具体产品角色(Concrete Product)-- 抽象gong模式所创建的具体实例对象

    总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。

    4.代码演示

    package test.com.abstractFactory;
    /**
     * Product(抽象角色)
     */
    public interface Fruit {
        
        public void get();
    }
    package test.com.abstractFactory;
    
    public abstract class Apple implements Fruit {
    
        public abstract void get();
    
    }
    package test.com.abstractFactory;
    
    public abstract class Banana implements Fruit {
    
        public abstract void get();
    
    }
    package test.com.abstractFactory;
    /**
     * Concrete Product(具体产品角色)
     */
    public class NorthApple extends Apple {
    
        @Override
        public void get() {
            System.out.println("采集北方苹果"); 
        }
    
    }
    package test.com.abstractFactory;
    /**
     * Concrete Product(具体产品角色)
     */
    public class SouthApple extends Apple {
    
        @Override
        public void get() {
            System.out.println("采集南方苹果");
        }
    
    }
    package test.com.abstractFactory;
    /**
     * Concrete Product(具体产品角色)
     */
    public class NorthBanana extends Banana {
    
        @Override
        public void get() {
            System.out.println("采集北方香蕉");
        }
    
    }
    package test.com.abstractFactory;
    /**
     * Concrete Product(具体产品角色)
     */
    public class SouthBanana extends Banana {
    
        @Override
        public void get() {
            System.out.println("采集南方香蕉");
        }
    
    }
    package test.com.abstractFactory;
    /**
     * Creator(抽象工厂角色)
     */
    public interface FruitFactory {
        
        public Fruit getApple();
        
        public Fruit getBanana();
    }
    package test.com.abstractFactory;
    /**
     * Concrete Creator(具体工厂角色)
     */
    public class NorthFruitFactory implements FruitFactory {
    
        @Override
        public Fruit getApple() {
            return new NorthApple();
        }
    
        @Override
        public Fruit getBanana() {
            return new NorthBanana();
        }
    
    }
    package test.com.abstractFactory;
    /**
     * Concrete Creator(具体工厂角色)
     */
    public class SouthFruitFactory implements FruitFactory {
    
        @Override
        public Fruit getApple() {
            return new SouthApple();
        }
    
        @Override
        public Fruit getBanana() {
            return new SouthBanana();
        }
    
    }
    package test.com.abstractFactory;
    /**
     * 测试
     */
    public class MainClass {
        public static void main(String[] args) {
            FruitFactory ff = new NorthFruitFactory();
            Fruit f = ff.getApple();
            f.get();//采集北方苹果
            Fruit f1 = ff.getBanana();
            f1.get();//采集北方香蕉
            
            FruitFactory ff2 = new SouthFruitFactory();
            Fruit f2 = ff2.getApple();
            f2.get();//采集南方苹果
            Fruit f3 = ff2.getBanana();
            f3.get();//采集南方香蕉
            
        }
    }
  • 相关阅读:
    bzoj 1093: [ZJOI2007]最大半连通子图
    bzoj 1266 1266: [AHOI2006]上学路线route
    poj 2104 K-th Number
    洛谷 P3313 [SDOI2014]旅行
    cogs 306. [SGOI] 糊涂的记者
    cogs 1164. 跑步
    洛谷 1821: [JSOI2010]Group 部落划分 Group
    洛谷 U3357 C2-走楼梯
    洛谷 P3014 [USACO11FEB]牛线Cow Line
    洛谷 P2982 [USACO10FEB]慢下来Slowing down
  • 原文地址:https://www.cnblogs.com/zheaven/p/9964945.html
Copyright © 2020-2023  润新知