我前面的博文已经讲解了装饰者模式,如果你对这个模式还不太了解,建议先去看一下装饰者模式再来看 这篇工厂模式与装饰这模式组合的组合模式。我还是以生产手机为例,只是这次生产手机我是通过工厂来生产的。
案例是这样的。华为有两款手机分别为PhoneI 与 PhoneII 由于某种原因,PhoneI 生产的时候必须带一个电磁,PhoneI I生产的时候必须搭配一个充电器和电磁。下面我将用两个工厂分别生产者两种手机,并用不同数量的装饰品去装(将电池和充电器看做是装饰品)饰手机。
先来看看如何创建工厂的 。
1 新建一个工厂接口。所有的工厂都必须实现这个接口
public interface Factory {
IPhone creatPhone();
}
2 新建两个具体的工厂并实现Factory接口
/**
* 华为专门生产PhoneI类型手机的工厂,该工厂生产的手机包括了一个电池
*/
public class PhoneIFactory implements Factory {
@Override
public IPhone creatPhone() {
return new Battery(new PhoneI());
}
}
/**
* 华为专门生产PhoneII类型手机的工厂,该工厂生产的手机包括了一个充电器和一个电池
*/
public class PhoneIIFactory implements Factory{
@Override
public IPhone creatPhone() {
return new Battery(new Charger(new PhoneII()));
}
}
3 工厂已经建好了,我们再来新建产品,首先新建一个 手机和装饰品的公共接口
public interface IPhone {
String getDescription();
double cost();
}
4 新建两个手机类
public class PhoneI implements IPhone{
private String name;
private double wight;
@Override
public String getDescription() {
return "华为I";
}
@Override
public double cost() {
return 2399;
}
}
public class PhoneII implements IPhone{
private String name;
private double wight;
@Override
public String getDescription() {
return "华为II";
}
@Override
public double cost() {
return 3999;
}
}
5 新建两个装饰品(电池与充电器)
public class Battery implements IPhone{
IPhone phone;
public Battery(IPhone phone){
this.phone = phone;
}
@Override
public String getDescription() {
return "华为手机通用电池,+"+phone.getDescription();
}
@Override
public double cost() {
return 200+phone.cost();
}
}
public class Charger implements IPhone{
IPhone phone;
public Charger(IPhone phone){
this.phone = phone;
}
@Override
public String getDescription() {
return "华为手机通用充电器,+"+phone.getDescription();
}
@Override
public double cost() {
return 100+phone.cost();
}
}
6 新建测试类
public class Test {
public static void main(String...strings){
//生产模型一的手机
Factory factory1 = new PhoneIFactory();
IPhone phoneI1 = factory1.creatPhone();
System.out.println(phoneI1.getDescription()+";总价:"+phoneI1.cost());
//生产模型二的手机
Factory factory2 = new PhoneIIFactory();
IPhone phoneII1 = factory2.creatPhone();
System.out.println(phoneII1.getDescription()+";总价:"+phoneII1.cost());
}
}
输出结果:
华为手机通用电池,+华为I;总价:2599.0
华为手机通用电池,+华为手机通用充电器,+华为II;总价:4299.0
看来我们已经从工厂得到了两种不同类型的手机了。