码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式那点事读书笔记(2)----抽象工厂模式

时间:2016-08-07 21:35:50      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

抽象工厂模式:

  此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类.

解决什么问题:

  抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦.

UML:

  技术分享

代码结构:

  技术分享

代码:

  定义抽象产品:

package com.demo.factory.model;

/**
 * 抽象产品
 */
public abstract class AbstractBaseFood {
    protected String kind;
    protected int num;
    protected float price;

    public float totalPrice() {
        return this.num * this.price;
    }
}

  产品接口:

package com.demo.factory.model;

/**
 * 抽象产品接口
 */
public interface IFood {
    void printMessage();
}

  抽象具体产品-Beverage类:

package com.demo.factory.model;

/**
 * 抽象具体产品-Beverage
 */
public abstract class Beverage extends AbstractBaseFood implements IFood{
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "饮料, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}

  抽象具体产品-ChickenWings类:

package com.demo.factory.model;

/**
 * 抽象具体产品-ChickenWings
 */
public abstract class ChickenWings extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "风味鸡翅, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}

  抽象具体产品-FrenchFries类:

package com.demo.factory.model;

/**
 * 抽象具体产品-FrenchFries
 */
public abstract class FrenchFries extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "风味薯条, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}

  抽象具体产品-Hamburg类:

package com.demo.factory.model;

/**
 * 抽象具体产品-Hamburg
 */
public abstract class Hamburg extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "风味汉堡, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());
    }
}

  具体产品-ChinaBeverage类:

package com.demo.factory.model.kfc;

import com.demo.factory.model.Beverage;

/**
 * 具体产品-ChinaBeverage
 */
public class ChinaBeverage extends Beverage {
    public ChinaBeverage(int num) {
        this.kind = "可乐";
        this.price = 8.0f;
        this.num = num;
    }
}

  具体产品-ChinaChickenWings类:

package com.demo.factory.model.kfc;

import com.demo.factory.model.ChickenWings;

/**
 * 具体产品-ChinaChickenWings
 */
public class ChinaChickenWings extends ChickenWings {
    public ChinaChickenWings(int num) {
        this.kind = "奥尔良";
        this.price = 2.5f;
        this.num = num;
    }
}

  具体产品-ChinaFrenchFries类:

package com.demo.factory.model.kfc;

import com.demo.factory.model.FrenchFries;

/**
 * 具体产品-ChinaFrenchFries
 */
public class ChinaFrenchFries extends FrenchFries {
    public ChinaFrenchFries(int num) {
        this.kind = "普通";
        this.price = 8.0f;
        this.num = num;
    }
}

  具体产品-ChinaHamburg类:

package com.demo.factory.model.kfc;

import com.demo.factory.model.Hamburg;

/**
 * 具体产品-ChinaHumburg
 */
public class ChinaHamburg extends Hamburg {
    public ChinaHamburg(int num) {
        this.kind = "麻辣";
        this.price = 14.0f;
        this.num = num;
    }
}

  抽象工厂接口:

package com.demo.factory.itf;

import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;

/**
 * 抽象工厂接口
 */
public interface IKfcFactory {
    Hamburg createHamburg(int num);
    ChickenWings createChickenWings(int num);
    FrenchFries createFrenchFries(int num);
    Beverage createBeverage(int num);
}

  实际工厂:

package com.demo.factory.itf;

import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
import com.demo.factory.model.kfc.ChinaBeverage;
import com.demo.factory.model.kfc.ChinaChickenWings;
import com.demo.factory.model.kfc.ChinaFrenchFries;
import com.demo.factory.model.kfc.ChinaHamburg;

/**
 * 实际工厂
 */
public class ChinaKfcFactory implements IKfcFactory {
    @Override
    public Hamburg createHamburg(int num) {
        return new ChinaHamburg(num);
    }

    @Override
    public ChickenWings createChickenWings(int num) {
        return new ChinaChickenWings(num);
    }

    @Override
    public FrenchFries createFrenchFries(int num) {
        return new ChinaFrenchFries(num);
    }

    @Override
    public Beverage createBeverage(int num) {
        return new ChinaBeverage(num);
    }
}

  客户类:

package com.demo.factory.custom;

import com.demo.factory.itf.IKfcFactory;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;

/**
 * 客户类
 */
public class Customer {
    private IKfcFactory kfcFactory;

    public Customer(IKfcFactory kfcFactory) {
        this.kfcFactory = kfcFactory;
    }

    public float orderHamburg(int num) {
        Hamburg hamburg = kfcFactory.createHamburg(num);
        hamburg.printMessage();
        return hamburg.totalPrice();
    }

    public float orderChickenWings(int num) {
        ChickenWings chickenWings = kfcFactory.createChickenWings(num);
        chickenWings.printMessage();
        return chickenWings.totalPrice();
    }

    public float orderFrenchFries(int num) {
        FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
        frenchFries.printMessage();
        return frenchFries.totalPrice();
    }

    public float orderBeverage(int num) {
        Beverage beverage = kfcFactory.createBeverage(num);
        beverage.printMessage();
        return beverage.totalPrice();
    }
}

  

设计模式那点事读书笔记(2)----抽象工厂模式

标签:

原文地址:http://www.cnblogs.com/arctique/p/5747117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!