创建型设计模式_01--工厂模式
来源:互联网 发布:淘宝小号可以开店吗 编辑:程序博客网 时间:2024/06/06 15:52
前言
从今天开始学习设计模式,最好的办法当然是实践。
本篇主要内容是说明工厂模式设计思路以及其JAVA Demo代码的实现。
工厂模式
工厂模式(Factory Pattern)是 Java中最常见的模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方法。
在工厂模式中,我们在创建对象时不会对创建者(工厂调用者)暴露创建不同对象的逻辑,只需要通过一个共同的接口来指向新创建的对象。
需要注意的是,工厂模式创建不同的对象比较适合于需要生成复杂对象的地方,而生成一些简单的对象,特别是只用new一下就可以生成的对象,如果要强行使用工厂模式,只会增加系统复杂度。
介绍
- 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
- 主要解决:主要解决接口选择的问题。
- 何时使用:我们明确地计划不同条件下创建不同实例时。
- 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
- 关键代码:创建过程在其子类执行。
应用实例:
- 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- 2、Hibernate 换数据库只需换方言和驱动就可以。
优点:
- 1、一个调用者想创建一个对象,只要知道其名称就可以了。
- 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景:
- 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 3、设计一个连接服务器的框架,需要三个协议,”POP3”、”IMAP”、”HTTP”,可以把这三个作为产品类,共同实现一个接口。
java 实现
我们将实现一个”造人工厂(person factory)“,生产不同职业的”人(Person)“。呵呵,看起来不太恰当,毕竟只是demo,将就着看吧。
1.新建一个接口(Interface) Person.java
//工厂创建的实例的class都实现了Person接口public interface Person { void printIntroduction();}
2.创建实现接口的实体类
//Doctor.javapublic class Doctor implements Person{ @Override public void printIntroduction() { // TODO Auto-generated method stub System.out.println("I am a doctor"); }}
//Student.javapublic class Student implements Person { @Override public void printIntroduction() { // TODO Auto-generated method stub System.out.println("I am a student."); }}
//Teacher.javapublic class Teacher implements Person { @Override public void printIntroduction() { // TODO Auto-generated method stub System.out.println("I am a teacher."); }}
3.创建一个工厂,用于创建不同的对象
//PersonFactory.javapublic class PersonFactory { //根据传入对象名create不同对象的实例 public Person createPerson(String personType){ String type = personType.toUpperCase(); if(type.equals("DOCTOR")){ return new Doctor(); }else if(type.equals("STUDENT")){ return new Student(); }else if(type.equals("TEACHER")){ return new Teacher(); }else{ System.out.println("error person type !"); } return null; }}
至此,一个最简单的工厂模式已经实现了,下面我们来看一下如何使用
4.编写demo查看效果
//FPDemo.javapublic class FPDemo { private void test() { PersonFactory factory = new PersonFactory(); Person []pa = new Person[3]; pa[0] = factory.createPerson("student"); pa[1] = factory.createPerson("teacher"); pa[2] = factory.createPerson("doctor"); for(Person person : pa){ person.printIntroduction(); } } public static void main(String [] args){ new FPDemo().test(); }}
运行结果:
I am a student.I am a teacher.I am a doctor
如果要增加创建对象的类型,只需要增加相应的实体类实现Person接口的方法,并且在factory中增加创建判断就可以了。
ps:有错误或不当的地方,欢迎指出
0 0
- 创建型设计模式_01--工厂模式
- 设计模式 - 创建型模式 - 工厂模式
- 创建型设计-工厂模式
- 设计模式-创建型模式-抽象工厂
- 设计模式-创建型模式-工厂方法
- 设计模式--创建型--工厂模式
- 设计模式-创建型模式-抽象工厂
- 【设计模式】创建型模式-工厂方法
- 【设计模式】创建型模式-抽象工厂
- 创建型设计模式---工厂模式
- 创建型设计模式:简单工厂模式
- 设计模式-创建型之工厂模式
- 创建型设计模式-简单工厂模式
- 创建型设计模式-抽象工厂模式
- 设计模式-----创建型之工厂模式
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- (C++设计模式) ------工厂模式factory -- 创建型模式
- ActionListener的三种实现方法
- CMDB内功心法,助我登上运维之巅
- DHTMLX-Windows
- MyBatis-----MyBatis传递数组参数
- Spark内核介绍
- 创建型设计模式_01--工厂模式
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
- 山科大oj--字符串的连接 之一 (Append Code)
- 文字轮播与图片轮播
- codeigniter Message: mkdir(): Invalid path Filename: drivers/Session_files_driver.php
- spring添加<aop:aspectj-autoproxy>让注解自为类生成代理对象时出错
- 背景透明文字不透明
- Tomcat类加载机制触发的Too many open files问题分析
- cifar10尝试直接用图片训练