提供创建对象的接口。
可以做一些初始化工作等,尤其是在对象的关系比较复杂的情况下,好处更加明显。
工厂模式一般与单例模式配合使用。
工厂模式分为两种:工厂方法(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."); } }