工厂模式是常用的实例化对象的模式,是使用工程方法替代new操作的一种模式。工厂模式主要是为来创建对象提供过渡接口,以便更好的封装对象的实例化过程,降低模块之间的耦合程度。
工厂模式可以分为三类。简单工厂模式、工厂方法模式、抽象工厂模式。三种模式抽象程度逐步提高。
本章主要讨论以下简单的工厂模式,简单工厂模式又可以看作为静态工厂模式,可以理解为一个创建特定对象的工具类。
简单工厂模式的组成:
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
类图如下:
代码示例:
工厂模式可以分为三类。简单工厂模式、工厂方法模式、抽象工厂模式。三种模式抽象程度逐步提高。
本章主要讨论以下简单的工厂模式,简单工厂模式又可以看作为静态工厂模式,可以理解为一个创建特定对象的工具类。
简单工厂模式的组成:
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
类图如下:
代码示例:
下面通过简单的代码来说明下简单工程
1)创建产品接口
package myThink; /** * Created by fengxinzi on 17-12-12. */ /** * 抽象产品类,用来定义产品的公共方法 */ public interface Person { void eat (); void say(); }
2)创建产品1和产品2 对应Woman Man
package myThink; /** * Created by fengxinzi on 17-12-12. */ /** * 具体产品类,实现Persion接口。 */ public class Woman implements Person{ @Override public void eat() { System.out.println("Womon Eat"); } @Override public void say() { System.out.println("Womon Say"); } }
package myThink; /** * Created by fengxinzi on 17-12-12. */ /** * 具体产品Man类,实现Person接口 */ public class Man implements Person { @Override public void eat() { System.out.println("Man eat"); } @Override public void say() { System.out.println("Man say"); } }
3)创建工程方法
package myThink; /** * Created by fengxinzi on 17-12-12. */ public class PersonFactory { private static Person person = null; private static Woman woman= null; private static Man man= null; public static Person getInstance(String whichOne){ if("W".equals(whichOne)){ if(woman == null){ person = new Woman(); }else{ person = woman; } } if("M".equals(whichOne)){ if(man == null){ person = new Man(); }else{ person = man; } } return person; } }
4)创建模拟业务逻辑使用工程类实例化具体产品的过程。
package myThink; import org.junit.Test; /** * Created by fengxinzi on 17-12-12. */ public class FactoryTest { @Test public void testFactory(){ Person w = PersonFactory.getInstance("W"); w.eat(); Person m = PersonFactory.getInstance("M"); m.say(); } }
5)输出如下
Womon Eat
Man say
Process finished with exit code 0