11 Abstract factory patterns 抽象工厂模式

GoF Definition 定义:提供一个接口,以创建一系列相关的对象,而无需指定他们的具体实类( Provides an interface for creating families of related or dependent objects without specifying their concrete classes).

之前提到过听起来差不多的工厂模式(factory pattern),两者的区别在于:工厂模式定义了一个具体的工厂,这个工厂提供统一的接口,返回一系列相似的产品。而抽象工厂方法返回一个“工厂”,再通过这个工厂得到具体产品。抽象工厂模式比工厂模式多了一层,可以理解为“工厂的工厂”。而在作用上说,无论是工厂方法,还是抽象工厂方法,都是为了将用户接口和具体实现分离开来。

从另一个层面讲,工厂方法是提供了一级索引:工厂->产品。抽象工厂是两级索引:抽象工厂-> 具体工厂 -> 产品。

举一个具体的例子来说明抽象工厂模式。在贸易全球化时代,很少有公司能百分比自己生产一个产品,部分组件直接从供应商买就行了。例如制造一台手机,需要CPU、屏幕、电池、摄像头等部件。但手机厂商完全不需要自己设计生成这些零件,只需要写一个零件的需求规格说明,然后找供应商谈就行了。将这些组件排列组合,最后就能发布一系列产品了。

下面用代码来描述这个例子。

 

/**
 * Abstract Factory method patterns
 */

public class Main {
    public static void main(String[] args) {
        System.out.println("HighEndPhone-------\n");
        ICellPhoneFactory gaoDuanShouJi = new HighEndPhoneFactory();
        gaoDuanShouJi.getCpu().getCpuInfo();
        gaoDuanShouJi.getScreen().getScreenInfo();

        System.out.println("LowEndPhone--------\n");
        ICellPhoneFactory diDuanShouJi = new LowEndPhoneFactory();
        diDuanShouJi.getCpu().getCpuInfo();
        diDuanShouJi.getScreen().getScreenInfo();


    }
}
    // 定义屏幕零件的标准
    abstract class IScreen {
        protected float size = 0;
        protected String producer = "";

        public void getScreenInfo() {
            System.out.printf("Screen: made by %s, size = %.1f inch\n", producer, size);
        }
    }

    // 定义cpu的标准
    abstract class ICpu {
        protected float freq = 0;
        protected String baseBand = "";
        protected String producer = "";

        public void getCpuInfo() {
            System.out.printf("CPU: %s CPU, made by %s, frequency is %.2f Ghz\n", baseBand, producer, freq);
        }
    }

    // 生产手机的抽象工厂
    abstract class ICellPhoneFactory {
        abstract IScreen getScreen();

        abstract ICpu getCpu();
    }

    // 某通cpu的具体实现
    class QualcommCpu extends ICpu {
        QualcommCpu() {
            freq = 3.0f;
            baseBand = "5G";
            producer = "Qualcomm";
        }
    }

    // 发哥cpu的具体实现
    class MediaTekCpu extends ICpu {
        MediaTekCpu() {
            freq = 3.5f;
            baseBand = "4G";
            producer = "MediaTek";
        }
    }

    // JDI屏幕的具体实现
    class JDIScreen extends IScreen {
        JDIScreen() {
            size = 6.7f;
            producer = "JDI";
        }
    }

    // SHARP屏幕的具体实现
    class SharpScreen extends IScreen {
        SharpScreen() {
            size = 6.5f;
            producer = "SHARP";
        }
    }

    // 具体工厂的实现,生产高端手机型号
    class HighEndPhoneFactory extends ICellPhoneFactory {
        @Override
        IScreen getScreen() {
            return new SharpScreen();
        }

        @Override
        ICpu getCpu() {
            return new QualcommCpu();
        }
    }

    // 第二个具体工厂的实现,生产中端手机型号
    class LowEndPhoneFactory extends ICellPhoneFactory {
        @Override
        IScreen getScreen() {
            return new JDIScreen();
        }

        @Override
        ICpu getCpu() {
            return new MediaTekCpu();
        }
    }



运行结果:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值