zoukankan      html  css  js  c++  java
  • 设计模式-抽象工厂模式

    返回上一级目录:Java设计模式

    抽象工厂模式,相对于工厂方法模式来说,抽象工厂模式是用于产品簇的创建,向调用者提供多个系列产品对象。比如一套服饰,有衣服,有鞋,衣服属衣服产品类,鞋属鞋产品类,通过抽象工厂模式可以创建不同的衣服和鞋的组合。

    抽象工厂模式有4中角色:抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色。

    类关系图如下:

    抽象工厂角色,负责产品簇所有产品的创建,抽象工厂模式的核心

    /**
     * @Author zhouw
     * @Description 产品簇工厂
     * @Date 2020-01-17
     */
    public interface EleFactory {
    
        IComputer getComputer();
    
        IPhone getPhone();
    }

    抽象产品角色,产品簇中的抽象产品接口,有多个组成一个产品簇,例子中的产品簇由“IPhone”和“IComputer”组成

    public interface IPhone {
    
        String getPhoneName();
    }
    public interface IComputer {
    
        String getComputerName();
    }

    具体产品角色,抽象产品的具体实例,最终调用者需要的对象,包含真正的业务逻辑

    public class HuaweiPhone implements IPhone {
    
        @Override
        public String getPhoneName() {
            return "华为手机";
        }
    }
    public class HuaweiComputor implements IComputer {
    
        @Override
        public String getComputerName() {
            return "华为电脑";
        }
    }
    public class SumsungPhone implements IPhone {
    
        @Override
        public String getPhoneName() {
            return "三星手机";
        }
    }
    public class SumsungComputor implements IComputer {
    
        @Override
        public String getComputerName() {
            return "三星电脑";
        }
    }
    public class LenovoComputer implements IComputer {
    
        @Override
        public String getComputerName() {
            return "联想电脑";
        }
    }

    具体工厂角色,调用者通过具体工厂来创建产品实例,不同产品的组合应该有不同的产品工厂来创建,怎么组合产品由业务逻辑决定,这里以人使用的电子产品作为一个产品簇为例

    小明的电子产品

    public class XiaomingEle implements EleFactory {
    
        @Override
        public IComputer getComputer() {
            return new HuaweiComputor();
        }
    
        @Override
        public IPhone getPhone() {
            return new HuaweiPhone();
        }
    }

    小红的电子产品

    public class XiaohongEle implements EleFactory {
    
        @Override
        public IComputer getComputer() {
            return new HuaweiComputor();
        }
    
        @Override
        public IPhone getPhone() {
            return new SumsungPhone();
        }
    }

    小黑的电子产品

    public class XiaoheiEle implements EleFactory {
    
        @Override
        public IComputer getComputer() {
            return new SumsungComputor();
        }
    
        @Override
        public IPhone getPhone() {
            return null;
        }
    }

    小胖的电子产品

    public class XiaopangEle implements EleFactory {
    
        @Override
        public IComputer getComputer() {
            return null;
        }
    
        @Override
        public IPhone getPhone() {
            return null;
        }
    }

    最后看下应用

    public class Application {
    
        public static void main(String[] args) {
            XiaomingEle xiaoming = new XiaomingEle();
            System.out.println("我是小明," + say(xiaoming));
    
            XiaohongEle xiaohong = new XiaohongEle();
            System.out.println("我是小红," + say(xiaohong));
    
            XiaoheiEle xiaohei = new XiaoheiEle();
            System.out.println("我是小黑," + say(xiaohei));
    
            XiaopangEle xiaopang = new XiaopangEle();
            System.out.println("我,小胖," + say(xiaopang));
        }
    
        private static String say(EleFactory ele) {
            if (ele.getComputer() == null && ele.getPhone() == null) {
                return "我很穷,我用不起电脑和手机";
            } else if (ele.getComputer() == null) {
                return "我用不起电脑,我用的是" + ele.getPhone().getPhoneName();
            } else if (ele.getPhone() == null) {
                return "我用不起手机,我用的是" + ele.getComputer().getComputerName();
            } else {
                return "我用的是" + ele.getComputer().getComputerName() + "和" + ele.getPhone().getPhoneName();
            }
        }
    }

    输出:

    总结

    可以看出,抽象工厂模式是对工厂方法模式的进一步抽象,将不同种类的产品组合到一起创建,这样有一个好处就是可以保证系列产品的一致性,也可以说是多个对象的适配,而实际上这种应用场景很多,比如最常见的Servlet和ServletMapping。但是这个模式有个缺点就是不支持添加新种类的产品,否则就要修改抽象工厂来支持添加新种类的产品。

    返回上一级目录:Java设计模式

  • 相关阅读:
    对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式
    找到了一个动态加载web用户自定义控件的问题,不知道算不算是微软的bug
    今天碰到了一个取 REMOTE_USER 的问题
    解决震荡波补丁引起的oracle不能启动
    有几个gmail的邀请,需要的留个言吧。
    一种插入记录的方式,撇开效率,看看对不对
    Regex 类介绍
    Page执行周期
    一段xml deserialize解释
    突然产生的一个想法,写一个基类,用来完成对LoadControl后续操作进行管理
  • 原文地址:https://www.cnblogs.com/zhou-920644981/p/12218937.html
Copyright © 2011-2022 走看看