工厂模式
原理:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽起来,达到提高灵活性的目的
分类
简单工厂模式:定义一个用于创建对象的接口
工厂类角色:通过逻辑判断创建具体产品
抽象产品角色:具体产品继承的父类或者实现的接口
具体产品角色:工厂类所创建的对象就是该类的实例
工厂方法模式:
抽象工厂角色:具体工厂要继承的类或者实现的接口
具体工厂角色:创建具体产品的实例
抽象产品角色:具体产品继承的父类或者实现的接口
具体产品角色:具体工厂角色所创建的对象就是此角色的实例
抽象工厂模式:
抽象工厂角色:具体工厂要继承的类或者实现的接口
具体工厂角色:创建具体产品的实例
抽象产品角色:具体产品继承的父类或者实现的接口
具体产品角色:具体工厂角色所创建的对象就是此角色的实例
工厂方法和抽象工厂的区别
前者:
一个抽象工厂角色可以派生出多个具体工厂角色
一个抽象产品角色可以派生出多个具体产品角色
一个具体工厂角色只能只能实例一个具体产品角色
后者:
一个抽象工厂角色可以派生出多个具体工厂角色
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
每个具体工厂类可以创建多个具体产品的实例
代码实例
简单工厂模式
抽象产品类
//抽象产品类
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)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构
(2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构