设计模式之抽象工厂模式

15 篇文章 0 订阅
6 篇文章 0 订阅

关于设计模式的学习笔记,教材:《设计模式的艺术之道》 刘伟 著

首先是介绍产品等级结构和产品组的概念:
产品等级结构:例如一个抽象类是电视机,其子类的有乐视TV、小米TV等,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构。
产品族:产品族是指由同一个工厂生产的,位于不同产品登记结构的一组产品。就像小米工厂不止生产小米TV,还生产小米手机。小米TV位于电视机的产品等级结构中,小米手机位于手机的产品等级结构中,小米TV、小米手机则构成了一个产品族。

当系统所提供的工厂生产的具体产品不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时,就可以使用抽象工厂模式。例如常见的皮肤,换皮肤会换了按钮、文本框、单选框等的皮肤,每个皮肤都是一个产品族。
工厂方法模式针对一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,创建一个产品族的所有对象。

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又成为Kit模式。

例题:
开发一个支持不同操作系统的手机游戏,针对不同的平台提供了不同的游戏操作控制类和游戏界面控制类,并提供相应的工厂类来封装这些类的初始化过程。

<?xml version="1.0"?>
<config>
<style>designPattern.AbstractFactory.AndroidCFactory</style>
</config>
public class XMLUtil {
    public static Object getControllerFactory() {
        try {
            //创建文档对象
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(new File("config.xml"));

            NodeList nodeList = document.getElementsByTagName("style");
            Node node = nodeList.item(0).getFirstChild();
            String className = node.getNodeValue().trim();
            Class c=Class.forName(className);
            Object o=c.newInstance();
            return o;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
public class Test {
    public static void main(String[] args){
        ControllFactory controllFactory= (ControllFactory) XMLUtil.getControllerFactory();
        InterfaceController interfaceController=controllFactory.createIC();
        OperationController operationController=controllFactory.createOC();
        interfaceController.click();
        operationController.up();
        //输出 安卓点击屏幕
        //安卓按上键
    }
}
abstract class InterfaceController {
    abstract void click();
}
abstract class OperationController {
    abstract void up();
}
public class AndroidIC extends InterfaceController {
    @Override
    void click() {
        System.out.println("安卓点击屏幕");
    }
}
public class AndroidOC extends OperationController {
    @Override
    void up() {
        System.out.println("安卓按上键");
    }
}
public class IOSIC extends InterfaceController {
    @Override
    void click() {
        System.out.println("iOS点击屏幕");
    }
}
public class IOSOC extends OperationController {
    @Override
    void up() {
        System.out.println("iOS按上键");
    }
}
interface ControllFactory {
    InterfaceController createIC();
    OperationController createOC();
}
public class AndroidCFactory implements ControllFactory {
    @Override
    public InterfaceController createIC() {
        InterfaceController androidIC=new AndroidIC();
        //初始化
        return androidIC;
    }

    @Override
    public OperationController createOC() {
        OperationController androidOC=new AndroidOC();
        //初始化
        return androidOC;
    }
}
public class IOSCFactory implements ControllFactory {
    @Override
    public InterfaceController createIC() {
        InterfaceController interfaceController=new IOSIC();
        //初始化
        return interfaceController;
    }

    @Override
    public OperationController createOC() {
        OperationController operationController=new IOSOC();
        //初始化
        return operationController;
    }
}

开闭原则的倾斜性

在抽象工厂模式中,增加新的产品组很方便,但是增加新的产品等级结构很麻烦,抽象工厂模式的这种性质成为开闭原则的倾斜性。
因此要求设计人员在设计之初就能够全面考虑,不会在设计完成之后向系统中增加新的产品等级结构,也不会删除已有的产品等级结构。

优点

  1. 工厂模式的优点就不重复了。
  2. 保证客户端始终只使用同一个产品族对象。
  3. 增加新的产品组很方便
  4. 可以通过配置文件等方式使得用户动态改变产品族

缺点就是增加或删除产品等级结构麻烦,要修改大量代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值