学习工厂模式的时候就曾思考过这么写的好处,再手动敲了代码后发现自己更糊涂了,后来搜索例子和各种文案才有点概念,特此记录一下个人的理解
工厂模式的好处:
1.减少了重复代码
2.让创建对象于使用方法分离,代码解耦
3.利于后期的维护,事实上你创建的工厂的作用就是给你提供你需要的对象,不用在代码中 一个个new Class,后期如果需要换对象不用在调用的地方去改,修改工厂类中实例化对象的方法就可以,
这些都是个人理解,有什么不对留言指正,下面是实现工厂模式的三种方法
一,简单工厂模式
1.创建一个接口或者抽象方法
1 /** 2 * 被创建者的公共接口 3 * @author lql29 4 * 5 */ 6 public interface Sender { 7 //公有方法 8 public void Send(); 9 }
2.创建两个实现类
1 public class MailSend implements Sender{ 2 3 @Override 4 public void Send() { 5 // TODO Auto-generated method stub 6 //实现接口方法 7 System.out.println("MailSender"); 8 } 9 10 }
public class SmsSend implements Sender{ @Override public void Send() { // TODO Auto-generated method stub //实现接口方法 System.out.println("SmsSend"); } }
3.创建一个工厂类
1 /** 2 * 工厂类 3 * @author lql29 4 * 5 */ 6 public class SenderFactory { 7 public Sender produce(String Type){ 8 if("mail".equals(Type)){ 9 return new MailSend(); 10 }else if("sms".equals(Type)){ 11 return new SmsSend(); 12 }else{ 13 System.out.println("请输入正确的类型!"); 14 return null; 15 } 16 } 17 }
最后实例化工厂类调用工厂类的produce方法,参数是想要返回被创建者对象的类型
二,工厂方法模式
1.创建被创建者接口
1 /** 2 * 被创建者接口 3 * @author lql29 4 * 5 */ 6 public interface PrudactInterface { 7 //定义公共方法 8 public void production(); 9 }
2.创建工厂接口
1 /** 2 * 定义工厂类接口 3 * @author lql29 4 * 5 */ 6 public interface FactoryInterface { 7 //创建对象方法 8 public PrudactInterface found(); 9 }
3.实现被创建者接口
1 /** 2 * 产品实体类 3 * @author lql29 4 * 5 */ 6 public class PrudactPojo implements PrudactInterface{ 7 8 @Override 9 public void production() { 10 // TODO Auto-generated method stub 11 //定义生成什么产品 12 System.out.println("生产芒果饮料。。。。。"); 13 } 14 15 }
1 /** 2 * 定义产品实体类 3 * @author lql29 4 * 5 */ 6 public class PrudactPojo_2 implements PrudactInterface{ 7 8 @Override 9 public void production() { 10 // TODO Auto-generated method stub 11 System.out.println("生成苹果饮料。。。。。。。"); 12 } 13 14 }
4.实现工厂接口
1 /** 2 * 定义PrudactPojo工厂实体类 3 * @author lql29 4 * 5 */ 6 public class FactoryPojo implements FactoryInterface{ 7 8 @Override 9 public PrudactInterface found() { 10 // TODO Auto-generated method stub 11 //实现创建对象方法, 12 PrudactInterface prudactPojo = new PrudactPojo(); 13 return prudactPojo; 14 } 15 16 }
1 public class FactoryPojo_2 implements FactoryInterface { 2 3 @Override 4 public PrudactInterface found() { 5 // TODO Auto-generated method stub 6 PrudactInterface prudactPojo_2 = new PrudactPojo_2(); 7 return prudactPojo_2; 8 } 9 10 }
这两种的方法的实现都相对较简单,简单工厂模式就是一个大工厂,里面根据分支条件来判断你需要的各种对象,这种并不灵活,所有的创建对象的方法都在一个工厂类里面,工厂方法就是将工厂细分,一个工厂只生产创建一个对象,后期对于代码更好的维护,
三,抽象工厂模式
1.创建接口
1 /** 2 *公共接口 3 * 4 */ 5 public interface Shape { 6 void draw(); 7 }
2.实现接口
1 /** 2 *接口实体类 3 */ 4 public class Rectangle implements Shape { 5 6 @Override 7 public void draw() { 8 System.out.println("Inside Rectangle::draw() method."); 9 } 10 }
1 /** 2 *接口实体类 3 * 4 */ 5 public class Square implements Shape { 6 7 @Override 8 public void draw() { 9 System.out.println("Inside Square::draw() method."); 10 } 11 }
3.创建扩展接口
1 /** 2 *扩展接口,颜色 3 */ 4 public interface Color { 5 void fill(); 6 }
4.实现扩展接口
1 public class Red implements Color { 2 3 @Override 4 public void fill() { 5 System.out.println("Inside Red::fill() method."); 6 } 7 }
1 public class Green implements Color { 2 3 @Override 4 public void fill() { 5 System.out.println("Inside Green::fill() method."); 6 } 7 }
5.创建工厂抽象类
1 /** 2 *抽象工厂方法 3 */ 4 public abstract class AbstractFactory { 5 public abstract Color getColor(String color); 6 public abstract Shape getShape(String shape) ; 7 }
6.实现工厂抽象类
1 /** 2 *实现工厂类,制定特定功能的工厂 3 * 4 */ 5 public class ShapeFactory extends AbstractFactory { 6 7 @Override 8 public Shape getShape(String shapeType){ 9 if(shapeType == null){ 10 return null; 11 } 12 if(shapeType.equalsIgnoreCase("CIRCLE")){ 13 return new Circle(); 14 } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 15 return new Rectangle(); 16 } else if(shapeType.equalsIgnoreCase("SQUARE")){ 17 return new Square(); 18 } 19 return null; 20 } 21 22 @Override 23 public Color getColor(String color) { 24 return null; 25 } 26 }
1 public class ColorFactory extends AbstractFactory { 2 3 @Override 4 public Shape getShape(String shapeType){ 5 return null; 6 } 7 8 @Override 9 public Color getColor(String color) { 10 if(color == null){ 11 return null; 12 } 13 if(color.equalsIgnoreCase("RED")){ 14 return new Red(); 15 } else if(color.equalsIgnoreCase("GREEN")){ 16 return new Green(); 17 } else if(color.equalsIgnoreCase("BLUE")){ 18 return new Blue(); 19 } 20 return null; 21 } 22 }
7.创建一个工厂创造器/生成器类
1 public class FactoryProducer { 2 public static AbstractFactory getFactory(String choice){ 3 if(choice.equalsIgnoreCase("SHAPE")){ 4 return new ShapeFactory(); 5 } else if(choice.equalsIgnoreCase("COLOR")){ 6 return new ColorFactory(); 7 } 8 return null; 9 } 10 }
最后通过FactoryProducer对象调用getFactory方法,参数被创建者的类型
总结:工厂模式的使用就是将创建对象与对象的使用解耦,在各个地方用对应的工厂类创造所需要的对象,最后如有修改对工厂统一修改