简单工厂模式
简单工厂模式分为三种:普通简单工厂、多方法简单工厂、静态方法简单工厂。
普通工厂模式
最近看了老酒馆电视剧,深深被陈怀海他们的情怀所感动,当然里面也有很多的酒,比如扳倒井,闷倒驴,跑舌头,吹破天,二闺女,枕头亲。我们以酒为例:
创建酒的接口:
- public interface Liqueur {
- public void taste();//酒味
- }
创建实现类:
(1)闷倒驴味道
- 1 public class Mdl implements Liqueur {
- 2 @Override
- 3 public void taste() {
- 4 System.out.println("我是闷倒驴,辣的!");
- 5 }
- 6 }
(2)跑舌头味道(里面的杜先生舌头惹了祸,没了,特意点了这跑舌头)
- 1 public class Pst implements Liqueur {
- 2 @Override
- 3 public void taste() {
- 4 System.out.println("我是跑舌头,苦的!");
- 5 }
- 6 }
建工厂类:
- 1 public class MakeLiqueurFactory {
- 2
- 3 /**
- 4 * 制造闷倒驴和跑舌头
- 5 */
- 6 public Liqueur make(String type){
- 7 if ("mdl".equalsIgnoreCase(type)){
- 8 return new Mdl();
- 9 }else if ("pst".equalsIgnoreCase(type)){
- 10 return new Pst();
- 11 }else {
- 12 return null;
- 13 }
- 14 }
- 15 }
测试:
- 1 public class LiqueurTest {
- 2
- 3 public static void main(String[] args){
- 4 MakeLiqueurFactory factory = new MakeLiqueurFactory();
- 5 Liqueur mdl = factory.make("mdl");
- 6 mdl.taste();
- 7 Liqueur pst = factory.make("pst");
- 8 pst.taste();
- 9 }
- 10 }
多方法简单工厂
在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
- 1 public class MakeLiqueurFactory {
- 2
- 3 /**
- 4 * 制造闷倒驴
- 5 */
- 6 public Liqueur makeMdl(){
- 7 return new Mdl();
- 8 }
- 9
- 10 /**
- 11 * 制造跑舌头
- 12 */
- 13 public Liqueur makePst(){
- 14 return new Pst();
- 15 }
- 16 }
测试:
- 1 public class LiqueurTest {
- 2
- 3 public static void main(String[] args){
- 4 MakeLiqueurFactory factory = new MakeLiqueurFactory();
- 5 Liqueur mdl = factory.makeMdl();
- 6 mdl.taste();
- 7 Liqueur pst = factory.makeMdl();
- 8 pst.taste();
- 9 }
- 10 }
静态方法简单工厂
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
- 1 public class MakeLiqueurFactory {
- 2
- 3 /**
- 4 * 制造闷倒驴
- 5 */
- 6 public static Liqueur makeMdl(){
- 7 return new Mdl();
- 8 }
- 9
- 10 /**
- 11 * 制造跑舌头
- 12 */
- 13 public static Liqueur makePst(){
- 14 return new Pst();
- 15 }
- 16 }
测试:
- 1 public class LiqueurTest {
- 2
- 3 public static void main(String[] args){
- 4 Liqueur mdl = MakeLiqueurFactory.makeMdl();
- 5 mdl.taste();
- 6 Liqueur pst = MakeLiqueurFactory.makePst();
- 7 pst.taste();
- 8 }
- 9 }
结果都是如下所示:
在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。