重学java23种设计模式(2)抽象工厂模式
2015-07-25 15:46
537 查看
定义:
抽象工厂模式(Abstract Factory Pattern)提供一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。
抽象工厂模式运行客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无需修改就可以获得新产品。这样一来,客户就从具体产品中解耦。
角色:
抽象产品
具体产品
抽象工厂
具体工厂
客户端
类图:
实例:
首先抽象基类
<span style="font-family: Arial; font-size: 14px;">public abstract class AbstractBaseFood {</span>
public String kind;
public int num;
public double price;
public double totalPrice(){
return num * price;
}
}
建立不同事物的抽象基类:
/*
* 汉堡基类
* */
public class Hamburg extends AbstractBaseFood implements IFood {
@Override
public void printlnMessage() {
System.out.println("--" + this.kind + "风味汉堡, \t\t 单价:" + this.price
+ ", \t\t 数量:" + this.num + ", \t\t 合计:" + this.totalPrice());
}
}
具体食物类
public class ChinaHamburg extends Hamburg {
public ChinaHamburg(int num) {
this.kind = "麻辣";
this.price = 14.0D;
this.num = num;
}
}
抽象工厂:
/*
* 肯德基抽象工厂
* 注意:创建的都是抽象食物
* */
public interface IKfcFactory {
// 生产汉堡
public Hamburg createHamburg(int num);
// 生产薯条
public FrenchFries createFrenchFries(int num);
// 生产鸡翅
public ChickenWings createChickenWings(int num);
// 生产饮料
public Beverage createBeverage(int num);
}
具体工厂
public class ChinaKfcFactory implements IKfcFactory {
@Override
public Hamburg createHamburg(int num) {
return new ChinaHamburg(num);
}
@Override
public FrenchFries createFrenchFries(int num) {
return new ChinaFrenchFries(num);
}
@Override
public ChickenWings createChickenWings(int num) {
return new ChinaChickenWings(num);
}
@Override
public Beverage createBeverage(int num) {
return new ChinaBeverage(num);
}
}
客户端类
public class Customer {
// 抽象工厂
private IKfcFactory kfcFactory;
// 构造方法将抽象工厂作为参数传递
public Customer(IKfcFactory kfcFactory) {
this.kfcFactory = kfcFactory;
}
/*
* 订购食物
*/
public double orderHamburg(int num) {
// 获得麻辣鸡腿汉堡
Hamburg hamburg = kfcFactory.createHamburg(num);
// 输出订购信息
hamburg.printlnMessage();
// 返回总价
return hamburg.totalPrice();
}
public double orderFrenchFries(int num) {
FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
frenchFries.printlnMessage();
return frenchFries.totalPrice();
}
public double orderChickenWings(int num) {
ChickenWings chickenWings = kfcFactory.createChickenWings(num);
chickenWings.printlnMessage();
return chickenWings.totalPrice();
}
public double orderBeverage(int num) {
Beverage beverage = kfcFactory.createBeverage(num);
beverage.printlnMessage();
return beverage.totalPrice();
}
}
调用
public class MainApp {
public static void main(String[] args) {
// 定义一个肯德基
IKfcFactory kfc = new ChinaKfcFactory();
// 走进肯德基准备点餐
Customer customer = new Customer(kfc);
// 点餐
double moneyHamburg = customer.orderHamburg(1);
double moneyChickenWings = customer.orderChickenWings(4);
double moneyFrenchFries = customer.orderFrenchFries(1);
double moneyBeverage = customer.orderBeverage(2);
System.out.println("总计:"
+ (moneyHamburg + moneyChickenWings + moneyFrenchFries + moneyBeverage));
}
}
代码敲到最后我开始明白软件秘籍的作者为什么不厌其烦做了四种食物而不是一种,是让读者思维更加清晰。
使用场合:
一句话总结:
个人觉得抽象工厂是下面三个设计模式的体现。
1、多用对象组合,少用继承
2、针对抽象编程,不针对实现编程
3,、产品对象通过工厂暴露的方法创建
Java SDK中的抽象工厂模式
java.sql.DriverManager
抽象工厂模式(Abstract Factory Pattern)提供一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。
抽象工厂模式运行客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无需修改就可以获得新产品。这样一来,客户就从具体产品中解耦。
角色:
抽象产品
具体产品
抽象工厂
具体工厂
客户端
类图:
实例:
首先抽象基类
<span style="font-family: Arial; font-size: 14px;">public abstract class AbstractBaseFood {</span>
public String kind;
public int num;
public double price;
public double totalPrice(){
return num * price;
}
}
/* * 抽象食物接口 * */ public interface IFood { void printlnMessage(); }
建立不同事物的抽象基类:
/*
* 汉堡基类
* */
public class Hamburg extends AbstractBaseFood implements IFood {
@Override
public void printlnMessage() {
System.out.println("--" + this.kind + "风味汉堡, \t\t 单价:" + this.price
+ ", \t\t 数量:" + this.num + ", \t\t 合计:" + this.totalPrice());
}
}
/* * 鸡翅基类 * */ public class ChickenWings extends AbstractBaseFood implements IFood { @Override public void printlnMessage() { System.out.println("--" + this.kind + "风味鸡翅, \t\t 单价:" + this.price + ", \t\t 数量:" + this.num + ", \t\t 合计:" + this.totalPrice()); } }
/* * 薯条基类 * */ public class FrenchFries extends AbstractBaseFood implements IFood { @Override public void printlnMessage() { System.out.println("--" + this.kind + "风味薯条, \t\t 单价:" + this.price + ", \t\t 数量:" + this.num + ", \t\t 合计:" + this.totalPrice()); } }
/* * 饮料基类 * */ public class Beverage extends AbstractBaseFood implements IFood { @Override public void printlnMessage() { System.out.println("--" + this.kind + "风味饮料, \t 单价:" + this.price + ", \t\t 数量:" + this.num + ", \t\t 合计:" + this.totalPrice()); } }
具体食物类
public class ChinaHamburg extends Hamburg {
public ChinaHamburg(int num) {
this.kind = "麻辣";
this.price = 14.0D;
this.num = num;
}
}
public class ChinaChickenWings extends ChickenWings { public ChinaChickenWings(int num) { this.kind = "奥尔良"; this.price = 2.5D; this.num = num; } }
public class ChinaFrenchFries extends FrenchFries { public ChinaFrenchFries(int num) { this.kind = "普通"; this.price = 8.0D; this.num = num; } }
public class ChinaBeverage extends Beverage { public ChinaBeverage(int num) { this.kind = "可乐"; this.price = 7.0D; this.num = num; } }
抽象工厂:
/*
* 肯德基抽象工厂
* 注意:创建的都是抽象食物
* */
public interface IKfcFactory {
// 生产汉堡
public Hamburg createHamburg(int num);
// 生产薯条
public FrenchFries createFrenchFries(int num);
// 生产鸡翅
public ChickenWings createChickenWings(int num);
// 生产饮料
public Beverage createBeverage(int num);
}
具体工厂
public class ChinaKfcFactory implements IKfcFactory {
@Override
public Hamburg createHamburg(int num) {
return new ChinaHamburg(num);
}
@Override
public FrenchFries createFrenchFries(int num) {
return new ChinaFrenchFries(num);
}
@Override
public ChickenWings createChickenWings(int num) {
return new ChinaChickenWings(num);
}
@Override
public Beverage createBeverage(int num) {
return new ChinaBeverage(num);
}
}
客户端类
public class Customer {
// 抽象工厂
private IKfcFactory kfcFactory;
// 构造方法将抽象工厂作为参数传递
public Customer(IKfcFactory kfcFactory) {
this.kfcFactory = kfcFactory;
}
/*
* 订购食物
*/
public double orderHamburg(int num) {
// 获得麻辣鸡腿汉堡
Hamburg hamburg = kfcFactory.createHamburg(num);
// 输出订购信息
hamburg.printlnMessage();
// 返回总价
return hamburg.totalPrice();
}
public double orderFrenchFries(int num) {
FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
frenchFries.printlnMessage();
return frenchFries.totalPrice();
}
public double orderChickenWings(int num) {
ChickenWings chickenWings = kfcFactory.createChickenWings(num);
chickenWings.printlnMessage();
return chickenWings.totalPrice();
}
public double orderBeverage(int num) {
Beverage beverage = kfcFactory.createBeverage(num);
beverage.printlnMessage();
return beverage.totalPrice();
}
}
调用
public class MainApp {
public static void main(String[] args) {
// 定义一个肯德基
IKfcFactory kfc = new ChinaKfcFactory();
// 走进肯德基准备点餐
Customer customer = new Customer(kfc);
// 点餐
double moneyHamburg = customer.orderHamburg(1);
double moneyChickenWings = customer.orderChickenWings(4);
double moneyFrenchFries = customer.orderFrenchFries(1);
double moneyBeverage = customer.orderBeverage(2);
System.out.println("总计:"
+ (moneyHamburg + moneyChickenWings + moneyFrenchFries + moneyBeverage));
}
}
代码敲到最后我开始明白软件秘籍的作者为什么不厌其烦做了四种食物而不是一种,是让读者思维更加清晰。
使用场合:
一句话总结:
个人觉得抽象工厂是下面三个设计模式的体现。
1、多用对象组合,少用继承
2、针对抽象编程,不针对实现编程
3,、产品对象通过工厂暴露的方法创建
Java SDK中的抽象工厂模式
java.sql.DriverManager
相关文章推荐
- JAVA中使用FTPClient上传下载
- java数字金额转化为中文金额
- Java 中常用缓存Cache机制的实现
- 身份证号正则校验(js校验+JAVA校验)
- java邮件开发
- Eclipse自定义快捷键导出和导入方法
- java web每天定时执行任务
- eclipse 配置 sublime主题风格
- eclipse快捷键
- Java基础之集合类常见试题
- java:Properties类的相关知识
- eclipse工具的使用心得
- java读取属性配置文件工具类
- eclipse工具的使用心得
- JDK 源码 阅读 - 3 - 设计模式 - 结构型模式
- 深入Java集合学习系列:HashMap的实现原理
- Java基础之垃圾回收机制以及内存泄露
- java多线程学习笔记——yield()、wait()、sleep()等方法
- Struts2配置详解_配置Action
- java新手笔记23 异常