首先我们为什么要学习设计模式呢?

1)模式从经验中总结出来的,经过证实的方案,模式只有在实际系统中经过多次验证之后才能成为模式.

2) 提高系统的可维护性, 通过使用设计模式,在系统面临升级和维护时,将把维护成本控制在最低的水平上.
3) 增加表达能力: 设计模式有很强的语言表述性. 设计模式是对解决方案的总结,使得设计模式能够更好的传达和交流,成为开发人员之间的一种共通语言,从而被更多的开发人员使用,反过来促进设计模式的发展和应用.
4)帮助我们更好的进行软件设计.

1 模式的概念:是具有代表性的重复性问题及其解答方案.

模式包含的要素:模式的名称  该模式所能解决的问题  解决方案  使用该模式后的效果

   工厂模式

定义:工厂模式就是集中创建实例对象

使用工厂模式的好处:

1)客户类和实现类分开。消费者任何时候需要某种产  品,只需向工厂请求即可。消费者无须修改就可以接纳新产品

2)对象的创建由工厂来完成, 类之间的耦合大大减少,变成为类和工厂之间的耦合了.

3)对象的创建和使用分离,达到解耦合的目的。
一:简单工厂模式
eg:工厂生产水果  需要生产苹果,香蕉,梨子
我们需要建立 苹果类,香蕉类,他们都有一个共同的行为就是生产,所以我们需要把它们共同的行为抽出来。
写一个最简单的代码:

  1. public interface Fruit {
  2.  
  3. public void showInfo();
  4.  
  5. }
  1. public class Banana implements Fruit{
  2. //香蕉类
  3. public void showInfo(){
  4. System.out.println("我是一个香蕉");
  5. }
  6.  
  7. }
  8.  
  9. //苹果类
  10. public class Apple implements Fruit {
  11.  
  12. public void showInfo(){
  13. System.out.println("我是一个苹果");
  14. }
  15.  
  16. }
  17.  
  18. //梨子类
  19. public class Pear implements Fruit{
  20.  
  21. @Override
  22. public void showInfo() {
  23.  
  24. System.out.println("我是一个梨子");
  25. }
  26.  
  27. }
  1. public class SimpleFactory {
  2.  
  3. public Apple getApple(){
  4. return new Apple();
  5. }
  6.  
  7. public Banana getBanana(){
  8. return new Banana();
  9. }
  10. }
 
  1. public class Test {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. Fruit a = new Apple();
  6. Fruit b = new Banana()
  7. a.showInfo();
  8. b.showInfo();
  9. }
  10.  
  11. }

如果需要生产梨子,橘子等等其他的水果的话,就需要建立很多的水果类,并且在SimpleFactory需要写得到各种水果的方法,在客户端还需要new各种水果的对象,这样对于开闭原则支持不够!还是根据情况来设计模式!

二:工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化委托给子类
还是以水果工厂为例:
我们需要建立      有一个水果接口,里面存在一个生产水果的方法.     苹果类.    苹果工厂生产苹果的类实现一个工厂生产水果的接口, 一个工厂生产水果的接口。客户端
建立一种水果的代码:
  1. //水果接口
  2. public interface Fruit {
  3.  
  4. public void showInfo();
  5.  
  6. }
  7.  
  8. //苹果类实现水果接口
  9. public class Apple implements Fruit {
  10.  
  11. public void showInfo(){
  12. System.out.println("我是一个苹果");
  13. }
  14.  
  15. }
  16.  
  17. //工厂得到水果接口
  18. public interface IFactoryMethod {
  19.  
  20. public Friut getFruit();
  21.  
  22. }
  23.  
  24. //苹果工厂实现得到水果接口
  25.  
  26. public class AppleFactroy implements IFactoryMethod {
  27.  
  28. @Override
  29. public Fruit getFruit() {
  30. return new Apple();
  31. }
  32.  
  33. }
  34.  
  35. //客户端
  36. public class Test {
  37.  
  38. public static void main(String[] args){
  39.  
  40. IFactoryMethod fm = new AppleFactroy();
  41. Fruit f = fm.getFruit();
  42. f.showInfo();
  43.  
  44. }
  45.  
  46. }
 
三:抽象工厂模式
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。(多个产品系列,多个工厂方法一起就构成了抽象工厂模式。)
在设计抽象工厂模式的时候会涉及到一个词:产品族
什么事产品族:是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
我们还是依然用水果工厂来举例:比如说我们的客户是需要的各种水果还分为北方或是南方的水果;还是使用苹果吧!
这里我们先分析要怎么去设计这个工厂:  水果接口(显示水果信息), 苹果类, 南方苹果(),北方苹果(), 抽象工厂的角色(接口),具体工厂的角色(南方工厂,北方工厂),客户端
  1. // 水果接口
  2. public interface Fruit {
  3.  
  4. public void showInfo();
  5.  
  6. }
  7.  
  8. //抽象苹果
  9. public abstract class Apple implements Fruit {
  10.  
  11. public abstract void showInfo();
  12.  
  13. }
  14.  
  15. //北方苹果
  16. public class NorthApple extends Apple {
  17.  
  18. @Override
  19. public void showInfo() {
  20. System.out.println("北方苹果。。");
  21.  
  22. }
  23.  
  24. }
  25.  
  26. //南方苹果
  27.  
  28. public class SouthApple extends Apple {
  29.  
  30. @Override
  31. public void showInfo() {
  32. System.out.println("南方苹果。。。");
  33.  
  34. }
  35.  
  36. }
  37.  
  38. //抽象工厂(接口)
  39.  
  40. public interface AbstractFactory {
  41.  
  42. public Fruit getApple();
  43.  
  44. //public Fruit getPear();
  45.  
  46. }
  47.  
  48. //南方工厂
  49.  
  50. public class SouthFactory implements AbstractFactory {
  51.  
  52. @Override
  53. public Fruit getApple() {
  54.  
  55. return new SouthApple();
  56. }
  57.  
  58. /*@Override
  59. public Friut getPear() {
  60. return new SouthPear();
  61. }*/
  62.  
  63. }
  64.  
  65. //北方工厂
  66.  
  67. public class NorthFactory implements AbstractFactory{
  68.  
  69. @Override
  70. public Fruit getApple() {
  71. return new NorthApple();
  72. }
  73.  
  74. /*@Override
  75. public Fruit getPear() {
  76. return new NorthPear();
  77. }*/
  78.  
  79. }
  80.  
  81. //客户端
  82. public class Test {
  83.  
  84. public static void main(String[] args) {
  85.  
  86. AbstractFactory af = new SouthFactory();
  87.  
  88. Fruit f = af.getApple();
  89.  
  90. f.showInfo();
  91. }
  92.  
  93. }

这样客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法就可以得到所需要的产品对象。

其优点:

     分离接口和实现

客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。

其缺点: 

    不太容易扩展新的产品

  如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

这样我们要增加水果种类的时候,只需要增加各类抽象水果,各类南方水果类,各类北方水果类。再到南北方工厂中增加得到增加水果的方法。

最后:

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。

什么时候该使用什么模式,我也不太清楚,还需要大家去实践,也要看客户有怎样的要求!
 
 
 

OOAD之创建型模式之工厂模式的更多相关文章

  1. 创建型设计模式之工厂模式(Abstract Factory)

    结构            意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性     一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...

  2. JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式

    上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...

  3. PYTHON设计模式,创建型之简单工厂模式

    这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...

  4. 创建型模式(过渡模式) 简单工厂模式(Simple Factory)

    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern) 是通过专门定义一个类来负责创建其他类的 ...

  5. Java中的GOF23(23中设计模式)--------- 工厂模式(Factory)

    Java中的GOF23(23中设计模式)--------- 工厂模式(Factory) 在给大家介绍工厂模式之前,我想和大家聊聊面向对象的那点事,在这里,引入三个概念. 开闭原则(Open Close ...

  6. java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式

    工厂模式定义(百度百科): 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工 ...

  7. javascript模式 (3)——工厂模式和装饰模式

    上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式 工厂模式: 工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过 ...

  8. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  9. Java中设计模式之工厂模式-4

    一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...

随机推荐

  1. Spring框架事务支持模型的优势

    全局事务 全局事务支持对多个事务性资源的操作,通常是关系型数据库和消息队列.应用服务器通过JTA管理全局性事务,API非常烦琐.UserTransaction通常需要从JNDI获取,意味着需要与JND ...

  2. Hibernate与Jpa的关系

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA的总体思想和现有Hibernate.T ...

  3. winform之combobox

    绑定键值对: ArrayList mylist = new ArrayList(); mylist.Add(new DictionaryEntry("WinFormURL", &q ...

  4. Sql 辅助

    1.清空数据表 SELECT 'TRUNCATE TABLE '+name AS TruncateSql FROM sys.tables

  5. CryptoJS与C#AES加解密互转

    CryptoJS下载地址: https://code.google.com/archive/p/crypto-js/downloads http://download.csdn.net/detail/ ...

  6. 使用ABP框架踩过的坑系列4

    数据库连接和事务管理,是数据库应用中的最重要概念之一.做过的人,都会头疼:何时Open一个连接?何时Start一个事务?何时Dispose这个连接?... ABP框架试图用一个叫做UnitOfWork ...

  7. NetCore入门篇:(八)Net Core项目使用Controller之三

    一.简介 1.本节主要说明入参的几种接收方式 二.不限定模式 1.定义一个id入参与一个model入参. 2.get\post分别查看访问效果. api代码 public class OneContr ...

  8. hdu 4325 Flowers(区间离散化)

    http://acm.hdu.edu.cn/showproblem.php?pid=4325 Flowers Time Limit: 4000/2000 MS (Java/Others)    Mem ...

  9. 程序媛计划——python初级class5~13

    列表和元组都是可迭代对象(可以用于for in) 列表 [] #添加列表元素: list.append(argu) #修改列表: list[2] = 2017 #删除列表元素 Del list[2] ...

  10. rawt

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...