XML第十二讲:设计模式:简单工厂模式

来源:互联网 发布:网络任务发布平台 编辑:程序博客网 时间:2024/04/28 10:29

    在讲XML解析的前面,我们来先学习一下简单工厂模式,因为这个模式对后面我们学习的XML解析是有关系的。

1. 回顾一下我们之前学过的设计模式:

单例设计模式

策略模式

动态代理模式

适配器模式 -- Adapter和Listener

观察者模式 [重要]

装饰者模式 [重要]

2. 简单工厂模式

1) 意图

   简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。通常它根据自变量的不同返回不同的类的实例

   [举个例子:比如说有个代工厂,它的业务是代工笔记本电脑,如thinkpad,Dell,Apple等,只要客户需要thinkpad,则这个工厂就提供相应的产品(thinkpad)给他,这个客户自然也不用知道thinkpad是如何制作出来的,只要出来的产品是符合客户需要的就可以了具体产品是如何创建的是由代工厂来决定的。这就是类似简单工厂模式]

2)适用性

    简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建出哪一个产品类的实例。

3) 简单工厂模式的构成

• 工厂类(Creator)角色: 担任这个角色的是简单工厂模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体类实现。[好比代工厂,核心]

• 抽象产品(Product)角色:担任这个角色的类是简单工厂模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个接口或者抽象类实现。[好比代工的产品,比如笔记本产品,是抽象的]

• 具体产品(Concrete Product)角色:简单工厂模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体类实现。[好比具体的笔记本产品,比如thinkpad,或者Dell等]

4) 实现自己的简单工厂模式

(1) 创建抽象产品角色:

package com.ahuier.simplefactory;/* * 抽象产品角色 * 好比如笔记本 */public abstract class Product {}

(2)创建两个具体产品角色

package com.ahuier.simplefactory;/* * 具体产品角色(可能有多个) * 好比如 thinkpad笔记本 */public class ConcreteProductA extends Product {}
package com.ahuier.simplefactory;/* * 具体产品角色(可能有多个) * 好比如 Dell笔记本 */public class ConcreteProductB extends Product {}

(3) 创建工厂类角色

package com.ahuier.simplefactory;/* * 工厂类角色 * 通常工厂类里面的方法是定义成一个静态的方法 */public class Creator {        //根据外部传入的参数返回对应的实例,类似根据传入客户的需求(thinkpad 或者 Dell)返回对应的产品。    public static Product createProduct(String str){               //常量"A"最好写在比较表达式的前面        if("A".equals(str)){            return new ConcreteProductA(); //其实在这里需要完成的是一个复杂的逻辑        }        if("B".equals(str)){            return new ConcreteProductB();        }        return null;    }}

(4)创建一个客户端

package com.ahuier.simplefactory;/* * 客户端 * 好比如客户 */public class Client {        public static void main(String[] args) {        /*         * 这边作为客户端,创建类的实例是由工厂帮我们创建的。以前是用new的形式。         * 也就是把创建实例的责任推给了工厂,我们只是传给它参数它就返回对应的实例。         */        Product productA = Creator.createProduct("A");        System.out.println(productA.getClass().getName());                Product productB = Creator.createProduct("B");        System.out.println(productB.getClass().getName());    }    }

[编译执行结果]:com.ahuier.simplefactory.ConcreteProductA
              com.ahuier.simplefactory.ConcreteProductB


下一讲我们就来讲解如何使用好简单工厂模式,也就是利用这种模式来进行XML解析。








原创粉丝点击