提供创建对象的接口。
可以做一些初始化工作等,尤其是在对象的关系比较复杂的情况下,好处更加明显。
工厂模式一般与单例模式配合使用。
工厂模式分为两种:工厂方法(Factory Method),抽象工厂(Abstract Factory)。
工厂方法
FactoryMethod.java
package com.gary.designpattern.factory.factorymethod;
import com.gary.designpattern.factory.obj.Obj;
import com.gary.designpattern.factory.obj.ObjA;
import com.gary.designpattern.factory.obj.ObjB;
/**
* 工厂方法
* @author gary
*
*/
public class FactoryMethod {
public Obj createObj(String ObjName){
if("ObjA".equals(ObjName)){
return new ObjA();
}else if("ObjB".equals(ObjName)){
return new ObjB();
}else{
return null;
}
}
}
Test.java
package com.gary.designpattern.factory.factorymethod;
import com.gary.designpattern.factory.obj.Obj;
/**
* 测试
* @author gary
*
*/
public class Test {
public static void main(String[] args) {
FactoryMethod factory = new FactoryMethod();
Obj oa = factory.createObj("ObjA");
oa.hello();
Obj ob = factory.createObj("ObjB");
ob.hello();
}
}
抽象工厂
Factory.java
package com.gary.designpattern.factory.abstractfactory;
import com.gary.designpattern.factory.obj.Obj;
/**
* 抽象工厂,用来产生Obj对象,适用于较复杂情况
* @author gary
*
*/
public abstract class Factory {
public abstract Obj createObj();
}
AbstractFactoryA.java
package com.gary.designpattern.factory.abstractfactory;
import com.gary.designpattern.factory.obj.Obj;
import com.gary.designpattern.factory.obj.ObjA;
/**
* 工厂A用来产生ObjA
* @author gary
*
*/
public class AbstractFactoryA extends Factory{
@Override
public Obj createObj() {
return new ObjA();
}
}
AbstractFactoryB.java
package com.gary.designpattern.factory.abstractfactory;
import com.gary.designpattern.factory.obj.Obj;
import com.gary.designpattern.factory.obj.ObjB;
/**
* 工厂B用来产生ObjB
* @author gary
*
*/
public class AbstractFactoryB extends Factory{
@Override
public Obj createObj() {
return new ObjB();
}
}
Test.java
package com.gary.designpattern.factory.abstractfactory;
import com.gary.designpattern.factory.obj.Obj;
/**
* 测试
* @author gary
*
*/
public class Test {
public static void main(String[] args) {
AbstractFactoryA factoryA = new AbstractFactoryA();
Obj oa = factoryA.createObj();
oa.hello();
AbstractFactoryB factoryB = new AbstractFactoryB();
Obj ob = factoryB.createObj();
ob.hello();
}
}
公用Obj
package com.gary.designpattern.factory.obj;
public interface Obj {
public void hello();
}
package com.gary.designpattern.factory.obj;
public class ObjA implements Obj {
@Override
public void hello() {
System.out.println("Hello!This is ObjA.");
}
}
package com.gary.designpattern.factory.obj;
public class ObjB implements Obj {
@Override
public void hello() {
System.out.println("Hello!This is ObjB.");
}
}