设计模式之工厂设计模式(一:简单工厂模式与工厂方法模式)
2014-04-06 15:14
288 查看
工厂模式:用来实例化有共同接口的类,应用工厂模式可以动态决定实例化哪一个类
工厂模式的分类:
1、简单工厂模式(Simple Factory)
2、工厂方法模式(Factory Method)
*3、抽象工厂模式(Abstruct Factory)
(本文先介绍总结简单工厂模式和工厂方法模式,抽象工厂模式比较复杂。。等我弄懂了再另开一篇文章来介绍总结)
1、简单工厂模式(Simple Factory):
又叫静态工厂,主要是一个静态方法,通过if语句来动态实现需要实现的类。我们通过产品A,产品B的例子来说明:
1.首先为所有的产品定义一个共同的产品接口
2.然后,我们让所有产品都实现这个接口
3.最后,我们写一个工厂类来动态实现以上的产品类
由此,我们可以看出,当用户输入不同的产品名时,工厂就会产生对应的产品。但实际上,简单工厂模式有很多局限性。比如说要添加新产品时,就需要再写一段else if代码进去,而且产品之间必须要同一级的,不能有复杂的层次关系,假若产品数十分多,那日后维护起来是相当困难的。最致命的是,简单工厂模式其实只是依赖SimpleFactory这一个类,如果这个类出了问题,工厂就不能工作。
这一致命性的缺点将在工厂方法模式中得到解决。
2、工厂方法模式(Factory Method):
工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能。
1.跟简单工厂模式一样,先定义产品类共同的接口:
1 public interface Product{}
2.为工厂类定义共同接口:
3.让所有产品实现产品接口:
4.接下来是工厂方法的核心部分,创建实现具体产品的具体工厂类
由此可见,工厂方法模式与简单工厂模式的区别在于:工厂方法模式是一个工厂对应一个类,而不像简单工厂模式那样把生产产品的职能都放在同一个类里边,这样的好处就是,如果其中一个类出了问题,其他的类还能正常工作,相互之间不受影响。当然,工厂方法模式也有局限的地方:当产品之间存在复杂的层次关系时,就需要构建多个工厂,这样就产生了所谓的“类爆炸”,对于以后的维护来说也是相当不利的。要解决这个复杂的层次关系的问题,我们可以用最后一种工厂模式,即抽象工厂模式来解决,但由于抽象工厂模式比较复杂,本人也不太会说明,所以我会另开一篇从别处转载的文章来说明抽象工厂模式,对读者造成不便请谅解!
工厂模式的分类:
1、简单工厂模式(Simple Factory)
2、工厂方法模式(Factory Method)
*3、抽象工厂模式(Abstruct Factory)
(本文先介绍总结简单工厂模式和工厂方法模式,抽象工厂模式比较复杂。。等我弄懂了再另开一篇文章来介绍总结)
1、简单工厂模式(Simple Factory):
又叫静态工厂,主要是一个静态方法,通过if语句来动态实现需要实现的类。我们通过产品A,产品B的例子来说明:
1.首先为所有的产品定义一个共同的产品接口
1 public interface Product{}
2.然后,我们让所有产品都实现这个接口
1 public class ProductA implements Product{ 2 public ProductA(){ 3 System.out.println("ProductA被制造了"); 4 } 5 } 6 7 public class ProductB implements Product{ 8 public ProductB(){ 9 System.out.println("ProductB被制造了"); 10 } 11 }
3.最后,我们写一个工厂类来动态实现以上的产品类
1 public SimpleFactory{ 2 public static Product create(String s){ 3 if(s.equals("ProductA")) 4 return new ProductA(); 5 else if(s.equals("ProductB")) 6 return new ProductB(); 7 } 8 }
由此,我们可以看出,当用户输入不同的产品名时,工厂就会产生对应的产品。但实际上,简单工厂模式有很多局限性。比如说要添加新产品时,就需要再写一段else if代码进去,而且产品之间必须要同一级的,不能有复杂的层次关系,假若产品数十分多,那日后维护起来是相当困难的。最致命的是,简单工厂模式其实只是依赖SimpleFactory这一个类,如果这个类出了问题,工厂就不能工作。
这一致命性的缺点将在工厂方法模式中得到解决。
2、工厂方法模式(Factory Method):
工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能。
1.跟简单工厂模式一样,先定义产品类共同的接口:
1 public interface Product{}
2.为工厂类定义共同接口:
1 public interface Factory{ 2 public Product create(); 3 }
3.让所有产品实现产品接口:
1 public class ProductA implements Product{ 2 public ProductA(){ 3 System.out.println("ProductA被制造了"); 4 } 5 } 6 7 public class ProductB implements Product{ 8 public ProductB(){ 9 System.out.println("ProductB被制造了"); 10 } 11 }
4.接下来是工厂方法的核心部分,创建实现具体产品的具体工厂类
1 //创建ProductA的工厂 2 public class FactoryA implements Factory{ 3 public Product create(){ 4 return new ProductA(); 5 } 6 } 7 8 //创建ProductB的工厂 9 public class FactoryB implements Factory{ 10 public Product create(){ 11 return new ProductB(); 12 } 13 }
由此可见,工厂方法模式与简单工厂模式的区别在于:工厂方法模式是一个工厂对应一个类,而不像简单工厂模式那样把生产产品的职能都放在同一个类里边,这样的好处就是,如果其中一个类出了问题,其他的类还能正常工作,相互之间不受影响。当然,工厂方法模式也有局限的地方:当产品之间存在复杂的层次关系时,就需要构建多个工厂,这样就产生了所谓的“类爆炸”,对于以后的维护来说也是相当不利的。要解决这个复杂的层次关系的问题,我们可以用最后一种工厂模式,即抽象工厂模式来解决,但由于抽象工厂模式比较复杂,本人也不太会说明,所以我会另开一篇从别处转载的文章来说明抽象工厂模式,对读者造成不便请谅解!
相关文章推荐
- GCC编译器选项
- ViewPager向导demo
- Java异常处理
- 获取ios可用的系统字体以及名字
- LeetCode: Palindrome Partitioning
- sort
- 关于回调机制的例子
- C++中 模板Template的使用
- LinearLayout布局
- Packmol 的安装
- [转]log4j.properties log4j.xml 路径问题
- Python 之getpass模块
- 第九章 子窗口控件
- HDU 1465(错排)
- 第5周作业-贷款计算器程序
- DOM操作样式表
- Word Ladder -- LeetCode
- 深入java基础
- back_inserter
- Sql Server中不常用的表运算符之PIVOT