设计模式-5-工厂模式

工厂模式

原理:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽起来,达到提高灵活性的目的
分类
简单工厂模式:定义一个用于创建对象的接口
工厂类角色:通过逻辑判断创建具体产品
抽象产品角色:具体产品继承的父类或者实现的接口
具体产品角色:工厂类所创建的对象就是该类的实例

工厂方法模式:
抽象工厂角色:具体工厂要继承的类或者实现的接口
具体工厂角色:创建具体产品的实例
抽象产品角色:具体产品继承的父类或者实现的接口
具体产品角色:具体工厂角色所创建的对象就是此角色的实例

抽象工厂模式:
抽象工厂角色:具体工厂要继承的类或者实现的接口
具体工厂角色:创建具体产品的实例
抽象产品角色:具体产品继承的父类或者实现的接口
具体产品角色:具体工厂角色所创建的对象就是此角色的实例

工厂方法和抽象工厂的区别
前者:
一个抽象工厂角色可以派生出多个具体工厂角色
一个抽象产品角色可以派生出多个具体产品角色
一个具体工厂角色只能只能实例一个具体产品角色
后者:
一个抽象工厂角色可以派生出多个具体工厂角色
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
每个具体工厂类可以创建多个具体产品的实例

代码实例

简单工厂模式
抽象产品类
//抽象产品类
public abstract class BMW {
	public BMW() {
		// TODO Auto-generated constructor stub
		System.out.println();
	}
}
具体产品类(两个)
//具体产品类
public class BMW320 extends BMW {
	public BMW320() {
		// TODO Auto-generated constructor stub
		System.out.print("制造     BMW320");
	}
}

public class BMW523 extends BMW{
	public BMW523() {
		// TODO Auto-generated constructor stub
		System.out.print("制造     BMW523");
	}

}

工厂类
public class Factory {
	
	public BMW createBMW(int type){
		
		switch (type) {
		case 320:
			return new BMW320();
		case 523:
			return new BMW523();
		default:
			break;
		}
		//这里要返回null,不然一直会报错(我的理解是当你进行switch的时候如果都没有的话,那么就没有返回了,会报错)
		return null;
	}
}

客户类
public class Customer {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Factory factory = new Factory();
		BMW car320 = factory.createBMW(320);
		BMW car523 = factory.createBMW(523);

	}

}
运行结果
制造     BMW320
制造     BMW523

工厂方法模式

抽象产品类
//抽象产品类
public abstract class BMW {
	public BMW() {
		// TODO Auto-generated constructor stub
		System.out.println();
	}
}
具体产品类(两个)
//具体产品类
public class BMW320 extends BMW {
	public BMW320() {
		// TODO Auto-generated constructor stub
		System.out.print("制造     BMW320");
	}
}

public class BMW523 extends BMW{
	public BMW523() {
		// TODO Auto-generated constructor stub
		System.out.print("制造     BMW523");
	}

}
抽象工厂
//抽象工厂
public abstract interface BMWFactory {
	abstract BMW createBMW();
}

具体工厂(两个)
//具体工厂
public class FactoryBMW320 implements BMWFactory{

	@Override
	public BMW createBMW() {
		// TODO Auto-generated method stub
		return new BMW320();
	}

}

//具体工厂
public class FactoryBMW523 implements BMWFactory {

	@Override
	public BMW createBMW() {
		// TODO Auto-generated method stub
		return new BMW523();
	}

}

客户端
public class Customer {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//一个具体工厂创建一个具体产品类
	FactoryBMW320 factoryBMW320 = new FactoryBMW320();
	BMW bmw = factoryBMW320.createBMW();
	
	FactoryBMW523 factoryBMW523 = new FactoryBMW523();
	BMW bmw2 = factoryBMW523.createBMW();

	}

}
运行结果
制造     BMW320
制造     BMW523

抽象工厂模式
多个一个抽象产品Weapon
public abstract class Weapon {
	public Weapon() {
		// TODO Auto-generated constructor stub
	}
}
具体抽象产品(两个)
public class AK47  extends Weapon{
	public AK47() {
		// TODO Auto-generated constructor stub
		System.out.println("这俩车配有AK47");
	}

}
public class Knife extends Weapon{
	public Knife() {
		// TODO Auto-generated constructor stub
		System.out.println("这俩车配有Knife");
	}

}

抽象工厂
//抽象工厂
public abstract interface BMWFactory {
	abstract BMW createBMW();
	abstract Weapon createWeapom();
}
具体抽象工厂(两个)
//具体工厂
public class FactoryBMW320 implements BMWFactory{

	@Override
	public BMW createBMW() {
		// TODO Auto-generated method stub
		return new BMW320();
	}

	@Override
	public Weapon createWeapom() {
		// TODO Auto-generated method stub
		return new Knife();
	}

}

//具体工厂
public class FactoryBMW523 implements BMWFactory {

	@Override
	public BMW createBMW() {
		// TODO Auto-generated method stub
		return new BMW523();
	}

	@Override
	public Weapon createWeapom() {
		// TODO Auto-generated method stub
		return new AK47();
	}

}
在具体抽象工厂中可以实例多个具体产品类,这是和工厂方法的区别之一(另外一个区别是工厂方法只有一个抽象产品,抽像工厂有多个产品)

客户端
public class Customer {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//一个具体工厂创建一个具体产品类
	FactoryBMW320 factoryBMW320 = new FactoryBMW320();
	BMW bmw = factoryBMW320.createBMW();
	Weapon knife = factoryBMW320.createWeapom();
	
	FactoryBMW523 factoryBMW523 = new FactoryBMW523();
	BMW bmw2 = factoryBMW523.createBMW();
	Weapon AK47 = factoryBMW523.createWeapom();

	}

}
运行结果
制造     BMW320这俩车配有Knife

制造     BMW523这俩车配有AK47

总结:

来自http://www.cnblogs.com/forlina/archive/2011/06/21/2086114.html 的总结(删清)
(1) 简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。 
(2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。 
(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值