Headfirst-6 抽象工厂模式

1         抽象工厂模式

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。抽象工厂(abstract factory)模式又称为Kit模式,属于对象创建型模式。

3.1 模式设计原则

依赖抽象,不要依赖具体类。

1 系统需要屏蔽有关对象如何创建,如何组织和如何表示。

2 系统需要由关联的多个对象来构成。

3 有关的多个对象需要一起应用并且他们的约束是强迫的(不可分离的)。

4 你想提供一组对象而不显示他们的实现过程,只显示他们的接口。

3.2 例子类图

抽象工厂

3.3 例子代码

/*
 * Cpu.java
 * Create on 2009-8-3 , 11:22
 */

package factory.abstractfactory;

/**
 * 定义 cpu 接口
 */
public interface Cpu {

    String getCpu();
}

/*
 * AMD.java
 * Create on 2009-8-3,11:25
 */

package factory.abstractfactory;

/**
 * AMD cpu
 */
public class AMD implements Cpu{

    public String getCpu() {
        return "Athlon XP 2800+";
    }

}

/*
 * Intel.java
 * Create on 2009-8-3,11:25
 */

package factory.abstractfactory;

/**
 * Intel cpu
 */
public class Intel implements Cpu{

    public String getCpu() {
        return "奔腾 4 3.2C";
    }

}

/*
 * HardDisk.java
 * Create on 2009-8-3,11:27
 */

package factory.abstractfactory;

/**
 *
 */
public interface HardDisk {

    public String getSize();
}

/*
 * Maxtor.java
 * Create on 2009-8-3,11:31
 */

package factory.abstractfactory;

/**
 * 定义Maxtor类,实现硬盘接口
 */
public class Maxtor implements HardDisk{

    public String getSize() {
        return "MaXLine Plus II 200G";
    }

}

/*
 * WestDigit.java
 * Create on 2009-8-3 12:26
 */

package factory.abstractfactory;

/**
 * 实现硬盘接口
 */
public class WestDigit implements HardDisk{

    public String getSize() {
        return "WD2005JD 250G";
    }

}

/*
 * MainBoard.java
 * Create on 2009-8-3 , 12:32
 */
package factory.abstractfactory;

/**
 * 主板接口,包含参数为 cpu 的公共方法 <CODE>attach()</CODE>。
 */
public interface MainBoard {

    void attach(Cpu cpu) throws Exception;
}

/*
 * MSI865PE.java
 * Create on 2009-8-3,12:35
 */

package factory.abstractfactory;

/**
 * 实现主板接口
 */
public class MSI865PE implements MainBoard{

    public void attach(Cpu cpu) throws Exception {
        if(cpu.getClass().toString().endsWith("Intel")){
            System.out.println("MSI856PE");
        }else{
            throw new Exception("主板 MSI865PE 只能配 Intel 的 cpu");
        }
    }

}

/*
 * MSIK7N2G.java
 * Create on 2009-8-3,12:35
 */

package factory.abstractfactory;

/**
 * 实现主板接口
 */
public class MSIK7N2G implements MainBoard{

    public void attach(Cpu cpu) throws Exception {
        if (cpu.getClass().toString().endsWith("AMD")) {
            System.out.println("MSIK7N2G");
        } else {
            throw new Exception("主板 MSIK7N2G 只能配 AMD 的 cpu");
        }
    }
}

/*
 * ComputerFactory.java
 * Create on 2009-8-3,12:46
 */

package factory.abstractfactory;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 定义抽象电脑工厂类
 */
public abstract class ComputerFactory {

    Cpu cpu;

    HardDisk hd;

    MainBoard mb;

    public void show(){
        System.out.println(this.getClass().getName().toString() + "生产的电脑配置");
        System.out.println("CPU:" + cpu.getCpu());
        System.out.println("HD:" + hd.getSize());
        System.out.println("MainBoard:");
        try {
            mb.attach(cpu);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

/*
 * DELL.java
 * Create on 2009-8-3,12:54
 */
package factory.abstractfactory;

/**
 * 生产厂商
 */
public class DELL extends ComputerFactory {

    DELL() {
        cpu = new AMD();
        hd = new Maxtor();
        mb = new MSIK7N2G();
    }
}

/*
 * IBM.java
 * Create on 2009-8-3,12:54
 */
package factory.abstractfactory;

/**
 * 生产厂商
 */
public class IBM extends ComputerFactory {

    IBM() {
        cpu = new Intel();
        hd = new WestDigit();
        mb = new MSI865PE();
    }
}

/*
 * Client.java
 * Create on 2009-8-3,13:41
 */

package factory.abstractfactory;

/**
 * 抽象工厂模式(Abstract Factory Pattern)<br>
 * 《深入浅出设计模式》<br>
 * <li>定义:<br>
 * 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂<br>
 * (Abstract Factory)模式又称为 Kit 模式,属于对象创建型模式。
 * <li>应用:<br>
 * 1.系统需要屏蔽有关对象如何创建、如何组织和如何表示。<br>
 * 2.系统需要由关联的多个对象来构成。<br>
 * 3.有关的多个对象需要一起应用并且他们的约束是强迫的(不可分离的)。<br>
 * 4.你想提供一组对象而不显示他们的实现过程,只显示他们的接口。
 *
 */
public class Client {

    public static void main(String[] args){
        IBM ibm = new IBM();
        ibm.show();
        DELL dell = new DELL();
        dell.show();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值