Factory and Decorator (工厂模式与装饰者模式)

我前面的博文已经讲解了装饰者模式,如果你对这个模式还不太了解,建议先去看一下装饰者模式再来看 这篇工厂模式与装饰这模式组合的组合模式。我还是以生产手机为例,只是这次生产手机我是通过工厂来生产的。

案例是这样的。华为有两款手机分别为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


看来我们已经从工厂得到了两种不同类型的手机了。





你可能感兴趣的:(Design,Patterns)