• 设计模式


    简介

    产品等级结构和产品族

    • 产品等级结构 :产品的继承结构。对于电视机,有海尔、海信、TCL 等品牌,抽象电视机与具体品牌的电视机之间构成了一个产品等级结构。
    • 产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔工厂生产的电视机、电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

    工厂方法模式中,一个具体工厂只生产一种产品。当工厂所生产的具体产品位于多个不同的产品等级结构中时,需要使用抽象工厂模式。

    在所有的工厂模式中,抽象工厂模式最为抽象,最具一般性。

    模式定义

    提供一个接口,用于创建一系列相关或相互依赖对象,而无须指定它们具体的类。

    模式特点

    抽象工厂模式包含四个角色:

    • Product:抽象产品
    • ConcreteProduct:具体产品
    • Factory:抽象工厂
    • ConcreteFactory:具体工厂

    这里写图片描述

    优缺点

    • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
    • 添加新产品时,需要修改抽象工厂及所有的工厂来添加这个产品(开闭原则的倾斜性,增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。

    PHP 代码示例

    <?php
    
    abstract class AbstractFactory
    {
        abstract function makeTV();
        abstract function makeCamera();
    }
    
    class TCLFactory
    {
        function makeTV() {
            return new TCLTV();
        }
        function makeCamera() {
            return new TCLCamera();
        }
    }
    class HaiXinFactory
    {
        function makeTV() {
            return new HaiXinTV();
        }
        function makeCamera() {
            return new HaiXinCamera();
        }
    }
    
    abstract class AbstractTV
    {
        abstract function f1();
    }
    class TCLTV extends AbstractTV
    {
        function f1() {
            echo "This is TCL TV";
        }
    }
    class HaiXinTV extends AbstractTV
    {
        function f1() {
            echo "This is HaiXin TV";
        }
    }
    
    abstract class AbstractCamera
    {
        abstract function f1();
    }
    class TCLCamera extends AbstractCamera
    {
        function f1() {
            echo "This is TCL Camera";
        }
    }
    class HaiXinCamera extends AbstractCamera
    {
        function f1() {
            echo "This is HaiXin Camera";
        }
    }
    
    $TCLFactory = new TCLFactory();
    $TCLTV = $TCLFactory->makeTV();
    $TCLCamera = $TCLFactory->makeCamera();
    
    $TCLTV->f1();
    $TCLCamera->f1();
  • 相关阅读:
    魅族手机不能通过设置Style和Background展示透明Activity的解决方法
    [翻译]The dark side of AsyncTask
    Eclipse卡死在Building workspace和android library update解决方法
    影响Java代码性能的一些细节
    WebView通过loadDataWithBaseURL加载本地页面卡死
    [04] Android逐帧动画(一)
    [03] Android系统亮度调节
    iOS UIViewContentMode详解
    setObject:forKey:与setValue:forKey:的区别
    选择排序
  • 原文地址:https://www.cnblogs.com/kika/p/10851575.html
Copyright © 2020-2023  润新知