设计模式——简单工厂方法模式
简单工厂模式:又称静态工厂方法模式,就是有一个专门生产某个产品的类。定义一个工厂类和方法(一般为静态方法),该方法根据参数创建不同产品。
1) 工厂类角色:这是本模式的核心,定义一个方法,该方法根据参数来创建不同产品
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例,由一个具体类实现。
例子一 使用静态方法,工厂类创建不同的面条
角色:抽象产品角色 抽象类
1 package com.test.factory; 2 3 public abstract class Noodle { 4 public abstract void description(); 5 }
角色:具体的不同产品 牛肉面
1 package com.test.factory; 2 3 public class NrNoodle extends Noodle { 4 @Override 5 public void description() { 6 System.out.println("来一碗牛肉面"); 7 } 8 }
角色:具体的不同产品 热干面
1 package com.test.factory; 2 3 public class RgNoodle extends Noodle { 4 @Override 5 public void description() { 6 System.out.println("来一碗热干面"); 7 } 8 }
角色:具体的不同产品 兰州拉面
1 package com.test.factory; 2 3 public class LzNoodle extends Noodle { 4 @Override 5 public void description() { 6 System.out.println("来一碗兰州拉面"); 7 } 8 }
角色:简单工厂类
1 package com.test.factory; 2 3 public class SimpleNoodleFactory { 4 public static final int LzNoodle = 1; 5 public static final int RgNoodle = 2; 6 public static final int NrNoodle = 3; 7 8 public static Noodle createNoodle(int type){ 9 switch (type){ 10 case LzNoodle: 11 return new LzNoodle(); 12 case RgNoodle: 13 return new RgNoodle(); 14 case NrNoodle: 15 return new NrNoodle(); 16 default: 17 return null; 18 } 19 } 20 }
测试。用户可以根据需求点牛肉面或者热干面
1 package com.test.factory; 2 3 public class SimpleFactoryTest { 4 public static void main(String[] args){ 5 Noodle myNoodle = SimpleNoodleFactory.createNoodle(SimpleNoodleFactory.LzNoodle); 6 if (myNoodle != null) { 7 myNoodle.description(); 8 } 9 myNoodle = SimpleNoodleFactory.createNoodle(SimpleNoodleFactory.NrNoodle); 10 if (myNoodle != null) { 11 myNoodle.description(); 12 } 13 } 14 }
测试结果
例子二 不使用静态方法
角色:抽象产品角色 接口
1 package com.test.factory1; 2 3 public interface Shape { 4 public abstract void draw(); 5 }
角色:具体的不同产品1
1 package com.test.factory1; 2 3 public class Square implements Shape { 4 @Override 5 public void draw() { 6 System.out.println("I am square."); 7 } 8 }
角色:具体的不同产品2
1 package com.test.factory1; 2 3 public class Rectangle implements Shape { 4 @Override 5 public void draw() { 6 System.out.println("I am rectangle."); 7 } 8 }
角色:具体的不同产品3
1 package com.test.factory1; 2 3 public class Circle implements Shape { 4 @Override 5 public void draw() { 6 System.out.println("I am circle."); 7 } 8 }
角色:简单工厂类
1 package com.test.factory1; 2 3 4 public class SimpleFactory { 5 6 public Shape getShape(String type){ 7 switch (type){ 8 case "square": 9 return new Square(); 10 case "circle": 11 return new Circle(); 12 case "rectangle": 13 return new Rectangle(); 14 default: 15 return new Rectangle(); 16 } 17 } 18 }
测试
1 package com.test.factory1; 2 3 public class SimpleFactoryTest { 4 public static void main(String[] args){ 5 SimpleFactory sf = new SimpleFactory(); 6 sf.getShape("circle").draw(); 7 sf.getShape("rectangle").draw(); 8 sf.getShape("square").draw(); 9 } 10 }
测试结果