zoukankan      html  css  js  c++  java
  • java23种设计模式之九: 抽象工厂方法模式

    一.抽象工厂定义

      上一讲我们说了一下工厂方法,那么我们如何对工厂进行抽象。

      因为工厂是生产产品的,现在我们需要工厂抽象,只生产抽象产品,不生产具体的产品,这同时也体现了java的多态。

      现在有2个抽象,一个是抽象工厂,另一个是抽象产品。

      下面介绍抽象产品到具体产品:

      产品的具体实现可以有多种方式,可以有抽象类去实现抽象产品中共有的方法,另一部分交给子类实现,这样,我们就可以把产品一些公有的属性抽象出来,一些

      特有的属性由子类根据自身条件实现,这样就可以有同种功能,不同型号的产品。

      下面介绍抽象工厂到具体工厂:

      抽象工厂是生产产品的,生产具体哪一款产品我们不得而知,但是我们可以通过前面的具体的产品来判断,生产同种类型的产品地方只能是具体类型工厂了,比如

      小米手机工厂只能生产小米手机,苹果手机工厂只生产苹果手机,这样我们就可以有具体的工厂了。下面看2个类型的示例:

    //接口
    interface Phone{
        //打电话
        void call();
        //发短信
        void sendMsg();
        //品牌
        void brand();
    }
    //抽象类,只实现部分功能
    abstract class AbstractPhone implements Phone{
        
        @Override
        public void call() {
            System.out.println("手机在打电话...");
        }
        @Override
        public void sendMsg() {
            System.out.println("手机在发信息...");
        }
    }
    //具体实现类1:苹果手机
    class ApplePhone extends AbstractPhone{
    
        @Override
        public void brand() {
            System.out.println("苹果手机");
            this.call();
            this.sendMsg();
        }
        
    }
    //具体实现类2:小米手机
    class XiaoMiPhone extends AbstractPhone{
    
        @Override
        public void brand() {
            System.out.println("小米手机");
            this.call();
            this.sendMsg();
        }
        
    }
    //抽象工厂:生产手机
    interface PhoneFactory{
        Phone createPhone();
    }
    //具体工厂1:生产苹果手机
    class ApplePhoneFactory implements PhoneFactory{
    
        @Override
        public Phone createPhone() {
            return new ApplePhone();
        }
    }
    //具体工厂2:生产小米手机
    class XiaoMiFactory implements PhoneFactory{
        @Override
        public Phone createPhone() {
            return new XiaoMiPhone();
        }
    }
    //接口
    interface Human{
        void getColor();
        void talk();
        void getSex();
    }
    //抽象类,只实现部分功能
    abstract class AbstractYellowHuman implements Human{
        @Override
        public void getColor() {
            System.out.println("yellow color...");
        }
        
        @Override
        public void talk() {
            System.out.println("yellow talk...");
        }
    }
    //具体实现类1:具体实现类会完成父类接口中未完成的方法
    class MaleYellowMan extends AbstractYellowHuman{
        @Override
        public void getSex() {
            System.out.println("yellow...male");
        }
    }
    //具体实现类2:具体实现类会完成父类接口中未完成的方法
    class FemaleYellowMan extends AbstractYellowHuman{
    
        @Override
        public void getSex() {
            System.out.println("yellow...female");
        }
    }
    //抽象工厂
    interface HumanFactory{
        Human createYelloHuman();
    }
    
    //具体工厂1:创建男性的工厂
    class MaleFactory implements HumanFactory{
        @Override
        public Human createYelloHuman() {
            return new MaleYellowMan();    //创建黄种人,男性角色
        }
    }
    
    //具体工厂2:创建女性的工厂
    class FemaleFactory implements HumanFactory{
        @Override
        public Human createYelloHuman() {
            return new FemaleYellowMan();
        }
    }
  • 相关阅读:
    Go语言之依赖管理
    Go之NSQ
    Redis相关
    Go语言操作mongoDB
    Go语言操作Redis
    mysql-5.7.22-winx64.zip 安装
    LL(1)文法系列(二)预测分析表
    LL(1)文法系列(三)预测分析程序
    LL(1)文法系列(一)first集和follow集
    算符优先系列之(二)算符优先关系表
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/11796766.html
Copyright © 2011-2022 走看看