上一篇屌丝有了人民币工厂,当时屌丝突然想去美国兜一圈怎么办。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性:
1、屌丝决定金额的大小
2、屌丝可以根据在不同的国度选择对应的货币
大家先看个类图
1.AbstractFactory
声明一个创建抽象产品对象的操作接口。
2.ConcreteFactory
实现创建具体产品对象的操作。
3.AbstractProduct
为一类产品对象声明一个接口。
4.ConcreteProduct
定义一个将被相应的具体工厂创建的产品对象。实现abstractProduct接口。
5.Client
仅使用由AbstractFactory和AbstractProduct类声明的接口
具体实现:
package creatingtype.abstractfactory;
public interface Money {
/**
* 打印钞票
*/
public void printMoney();
}
package creatingtype.abstractfactory;
public interface MoneyFactory {
//实例化RMB
public Money getRMB();
//实例化USD
public Money getUSD();
}
package creatingtype.abstractfactory;
public abstract class RMB implements Money {
/**
* 打印钞票
*/
public abstract void printMoney();
}
package creatingtype.abstractfactory;
public abstract class USD implements Money {
/**
* 打印钞票
*/
public abstract void printMoney();
}
package creatingtype.abstractfactory;
public class HundredFactory implements MoneyFactory {
public Money getRMB() {
return new RMB100();
}
public Money getUSD() {
return new USD100();
}
}
package creatingtype.abstractfactory;
public class RMB100 extends RMB {
public void printMoney() {
System.out.println("你获得了100的人民币一张");
}
}
package creatingtype.abstractfactory;
public class USD100 extends RMB {
public void printMoney() {
System.out.println("你获得了100的美元一张");
}
}
package creatingtype.abstractfactory;
public class FiftyFactory implements MoneyFactory {
public Money getRMB() {
return new RMB50();
}
public Money getUSD() {
return new USD50();
}
}
package creatingtype.abstractfactory;
public class RMB50 extends USD {
public void printMoney() {
System.out.println("你获得了50的人民币一张");
}
}
package creatingtype.abstractfactory;
public class USD50 extends USD {
public void printMoney() {
System.out.println("你获得了50的美元一张");
}
}
package creatingtype.abstractfactory;
// 抽象工厂模式
public class MainClass {
// 抽象工厂模式是所有形态的工厂模式中最为抽
// 象和最其一般性的。抽象工厂模式可以向客户端
// 提供一个接口,使得客户端在不必指定产品的具
// 体类型的情况下,能够创建多个产品族的产品对
// 象。
public static void main(String[] args) {
MoneyFactory ohf = new HundredFactory();
Money rmb100 = ohf.getRMB();
rmb100.printMoney();
Money usd100 = ohf.getUSD();
usd100.printMoney();
MoneyFactory ff = new FiftyFactory();
Money rmb50 = ff.getRMB();
rmb50.printMoney();
Money usd50 = ff.getUSD();
usd50.printMoney();
}
}