前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式----工厂方法模式

设计模式----工厂方法模式

作者头像
SuperHeroes
发布2018-05-30 17:09:47
3510
发布2018-05-30 17:09:47
举报
文章被收录于专栏:云霄雨霁云霄雨霁

工厂方法模式:

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。

工厂方法模式结构:

工厂方法模式一般有四个部分:抽象产品类、具体产品类、抽象工厂类、具体工厂类。

  • 抽象产品类:负责定义产品的共性,实现对事物最抽象的定义;
  • 具体产品类:继承抽象产品类,定制特色产品;
  • 抽象工厂类:负责定义产品的产生,以及对产品的操作;
  • 具体产品类:创建具体的产品。

工厂方法模式就是对使用new直接创建对象的一种替代方法,因为直接创建对象可能使得程序维护性差,if-else语句过多等弊端。

代码示例:

抽象产品类:

代码语言:javascript
复制
public abstract class Product {    
     public abstract void name(){}  
     public abstract void prise();    
}

具体产品类:

代码语言:javascript
复制
public class Product1 extends Product {
    //实现抽象类的方法
}
public class Product2 extends Product {
    //实现抽象类的方法
}

抽象工厂类:

代码语言:javascript
复制
public abstract class Cracter{
    //定义工厂方法,实例化产品由具体工厂实现
     public abstract <T extends Product> T createProduct(Class<T> c);  
    //可以添加对产品对象公有的操作
    ...
}

具体工厂类:

代码语言:javascript
复制
public class MyCracter extends Cracter{
     public <T extends Product> T createProduct(Class<T> c){  
         Product product=null;  
         try {  
                product = (Product)Class.forName(c.getName()).newInstance();  
         } catch (Exception e) {  
                //异常处理  
         }  
         return (T)product;           
     }  
}

使用场景:

代码语言:javascript
复制
public class Client {
     public static void main(String[] args) {
         Creator creator = new ConcreteCreator();
         Product product = creator.createProduct(Product1.class);
         //其他操作
         ...
     }
}

使用上面的这种工厂方法模式的优点是显而易见的:

  • 将创建产品对象和对产品对象的操作分离。
  • 扩展性非常优秀。以后要想添加新的产品类,只需简单的创建产品类,其他地方都不需要改变。
  • 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化。

设计原则--依赖倒置原则----要依赖抽象,不要依赖具体类。

下面的指导方针可以帮你避免违反依赖倒置原则:

  • 变量不可以持有具体类的引用
  • 不要让类派生自具体类
  • 不要覆盖基类中已实现的方法

要点:

  • 工厂方法使用继承:把对象的创建交给子类,子类实现工厂方法来创建对象。
  • 通过减少应用程序和具体类之间的依赖出尽松耦合。
  • 工厂方法允许将实例化延长到子类进行。

下一篇----抽象工厂模式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.11.05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档