设计模式-工厂模式

      工厂模式分为三种情况:简单工厂模式,工厂方法模式,抽象工厂模式,根据不同的场景选择相应的模式。

      简单工厂模式用于生产单一的产品,一般使用静态方法,根据传入的参数返回不同的对象实例。

      工厂方法模式,定义一个用于创建对象的接口,让子类决定创建哪个类,它使一个类型实例化延长到了子类。

      抽象方法模式,提供一系列创建相关或相互依赖对象的接口,而无需指定它们具体的类,通俗点说就是,一个工厂要生产多个产品,例如一个汽车厂要生产轮胎,生产照明灯,但是轮胎和照明灯又有不同的品牌。

简单工厂模式的实现

首先,一个Widget的接口,

public interface Widget {
	public void show();
}
其次,一个4x1和一个4x2的widget,
public class FourOneWidget implements Widget {
	public void show() {
		System.out.println("4x1 widget");
	}
}
public class FourTwoWidget implements Widget {
	public void show() {
		System.out.println("4x2 wiget");
	}
}
最后,来个创建Widget的工厂,
public class WidgetFactory {

	public static final String FOUR_ONE_TYPE = "4x1";
	public static final String FOUR_TWO_TYPE = "4X2";
	public static Widget createWidget(String type) {
		if(FOUR_ONE_TYPE.equals(type)) {
			return new FourOneWidget();
		} else if(FOUR_TWO_TYPE.equals(type)) {
			return new FourTwoWidget();
		}
		return null;
	}
}
这样一个简单的工厂方法就实现了,我们可以调用WidgetFactory的static方法来创建不同的Widget,但是每次调用都需要修改代码,也就是传递的参数type。

工厂方法模式的实现

首先,Widget以及FourOneWidget,FourTwoWidget的代码都是一样的(工厂方法的重点不是产品,而是生产产品的方式-_-),在这里对工厂做了抽象,然后派生出两个分别生产4x1和4x2widget的工厂,代码如下:

public interface WidgetFactory {

	public Widget createFactory();
}

public class FourOneWidgetFactory implements WidgetFactory {

	public Widget createFactory() {
		return new FourOneWidget();
	}
}

public class FourTwoWidgetFactory implements WidgetFactory {

	public Widget createFactory() {
		return new FourTwoWidget();
	}
}
这时候,我们再调用的时候就可以根据需求调用FourOneWidgetFactory或者FourTwoFactory了,而不用再修改代码。

抽象工厂方法的实现

首先一些需要生产的产品的类:

public interface Lamp {
	public void brand();
}
public class DZLamp implements Lamp {

	public void brand() {
		System.out.println("DZ Lamp");
	}
}
public class BMLamp implements Lamp {
	public void brand() {
		System.out.println("BM Lamp");
	}

}

public interface Wheel {
	public void brand();
}
public class DZWheel implements Wheel {

	public void brand() {
		System.out.println("DZ wheel");
	}
}
public class BMWheel implements Wheel {
	public void brand() {
		System.out.println("BM wheel");
	}
}
然后是不同的工厂,
public abstract class BMFactory {

	public abstract Wheel createBMWhell();
	public abstract Lamp createBMLamp();
}
public class BMOneFactory extends BMFactory {

	public Wheel createBMWhell() {
		return new BMWheel();
	}

	public Lamp createBMLamp() {
		return new BMLamp();
	}

}

public abstract class DZFactory {

	public abstract Lamp createDZLamp();
	public abstract Wheel createDZWheel();
}
public class DZOneFactory extends DZFactory {

	public Lamp createDZLamp() {
		return new DZLamp();
	}

	public Wheel createDZWheel() {
		return new DZWheel();
	}
}
最后,不同品牌的工厂生产相应的产品了。。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值