工厂模式

0人阅读 评论(0) 收藏 举报

介绍

工厂方法模式:顾名思义,类似于一个工厂对不同的产品进行加工,然后分配给需要该产品的商家。

步骤

第一步:创建抽象产品类People

[java] view plain copy
  1. package com.Plant;  
  2.   
  3. /** 
  4.  * 定义一个抽象工厂类 
  5.  */  
  6. public abstract class People {  
  7.     protected String position;//职位  
  8.   
  9.     private String name;//姓名  
  10.     private int age;//年龄  
  11.   
  12.     public String getName() { return name; }  
  13.   
  14.     public int getAge() { return age; }  
  15.   
  16.     public void setName(String name) {this.name = name; }  
  17.   
  18.     public void setAge(int age) { this.age = age; }  
  19.   
  20.     public People() {    }  
  21.   
  22.     public People(String position, String name, int age) {  
  23.         this.position = position;  
  24.         this.name = name;  
  25.         this.age = age;  
  26.     }  
  27.   
  28.     public void sleep(){  
  29.         System.out.println("一位"+this.age+"岁的"+this.position+"他的姓名为"+this.name+"正在睡觉!");  
  30.     }  
  31.   
  32.   
  33.     public abstract void job();//定义一个抽象方法  
  34. }  

第二步: 创建具体产品类

创建一个Student类继承People类,并且实现People的抽象方法。   

[java] view plain copy
  1. package com.Plant;  
  2.   
  3. /** 
  4.  * 学生类 
  5.  */  
  6. public class Student extends People {  
  7.     public Student() {  this.position="学生";  }  
  8.   
  9.     public Student(String name, int age) {  
  10.         super("学生", name, age);  
  11.     }  
  12.   
  13.     public void show(){  
  14.         System.out.println("啊?"+this.getName()+"考了100分。");  
  15.     }  
  16.     @Override  
  17.     public void job() {  
  18.         System.out.println(this.getName()+"今年"+this.getAge()+"岁"+"他的工作是学习。");  
  19.     }  
  20. }  

创建一个Teacher类继承People类,并且实现People的抽象方法。   

[java] view plain copy
  1. package com.Plant;  
  2.   
  3. /** 
  4.  * 老师类 
  5.  */  
  6. public class Teacher extends People {  
  7.     public Teacher() {  this.position="老师"; }  
  8.     public Teacher(String name, int age) {  
  9.         super("老师", name, age);  
  10.     }  
  11.     public void tell(Student student){  
  12.         System.out.println(this.getName()+"正在跟他的学生"+student.getName()+"讲道理,为什呢,因为"+student.getName()+"比较皮!");  
  13.     }  
  14.     @Override  
  15.     public void job() {  
  16.         System.out.println(this.getName()+"今年"+this.getAge()+"岁"+"他的工作是教书。");  
  17.     }  
  18. }  

创建一个Program类继承People类,并且实现People的抽象方法。

[java] view plain copy
  1. package com.Plant;  
  2.   
  3. /** 
  4.  * 程序员类 
  5.  */  
  6. public class Programmer extends People {  
  7.     public Programmer() { this.position="程序员"; }  
  8.     public Programmer(String name, int age) {  
  9.         super("程序员", name, age);  
  10.     }  
  11.     public void WorkOverTime(){//加班的方法(你懂的!!!)  
  12.         System.out.println(this.getAge()+"岁"+"苦逼"+this.position+this.getName()+"正在疯狂加班!!!!");  
  13.     }  
  14.     @Override  
  15.     public void job() {  
  16.         System.out.println(this.getName()+"今年"+this.getAge()+"岁"+"他的工作是打代码。");  
  17.     }  
  18. }  

第三步:创建工厂类Plant

[java] view plain copy
  1. package com.Plant;  
  2.   
  3. /** 
  4.  * 工厂类:根据特定的职位返回对应的的类 
  5.  */  
  6. public class Plant {  
  7.     public static People getInsent(String position){//定义一个static方法 根据你传入的参数 返回特定的对象  
  8.         if(position.equals("学生"))  
  9.             return new Student();             //因为Student类是继承People 可以直接返回Student的匿名对象  
  10.         if(position.equals("老师"))  
  11.             return new Teacher();  
  12.         if(position.equals("程序员"))  
  13.             return new Programmer();  
  14.         return null;  
  15.     }  
  16. }  

第四步:通过调用创建工厂类来创建不同的实例

[java] view plain copy
  1. package com.Plant;  
  2.   
  3. public class Main {  
  4.   
  5.     public static void main(String[] args) {  
  6.         //程序员  
  7.         People people=Plant.getInsent("程序员");  
  8.         people.setAge(20);                    //赋值  
  9.         people.setName("老仨");                 
  10.         people.job();                         //不能直接people.WorkOverTime()方法  
  11.         Programmer programmer=null;           //因为People类中没有WorkOverTime方法  
  12.         if(people instanceof Programmer)  
  13.             programmer=(Programmer)people;     //因此需要 向下转型  
  14.         programmer.WorkOverTime();  
  15.   
  16.         System.out.println("");  
  17.         //学生  
  18.         people=Plant.getInsent("学生");  
  19.         people.setAge(20);  
  20.         people.setName("熊X");  
  21.         people.job();  
  22.         people.sleep();  
  23.         Student student=null;  
  24.         if(people instanceof Student)  
  25.             student=(Student)people;  
  26.         student.show();  
  27.   
  28.         System.out.println("");  
  29.         //老师  
  30.         people=Plant.getInsent("老师");  
  31.         people.setName("杨老师");  
  32.         people.setAge(28);  
  33.         people.job();  
  34.         Teacher teacher=null;  
  35.         if (people instanceof Teacher)  
  36.             teacher=(Teacher)people;  
  37.         teacher.tell(student);  
  38.     }  
  39. }  

运行结果:


总结:由上面代码可看出,在工厂方法设计模式中。一直反复的用到面向对象的编程思想,即:1.封装:使代码模块化,安全性更高。2.继承:使代码可重用,减少一部分代码量。3.多态:一个接口,多种状态,让代码变得更灵活。

查看评论

面试问题,多态,工厂模式

具体说,多态就是基类的指针在调用虚函数成员的时候,运行时系统会根据指针实际指向的对象调用恰当的成员函数。 当一个方法在不同的环境中有不同的实现时,可以使用多态,抽象出一个接口,子类有不同的实现。 ...
  • digaoyang
  • digaoyang
  • 2014-12-03 10:13:19
  • 1438

为什么工厂模式是华而不实的—浅谈工厂模式的利与弊

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17428923说明:博主虚心接受大家的抨击,批评,指正前言我一直想介绍下工厂模...
  • singwhatiwanna
  • singwhatiwanna
  • 2013-12-20 01:26:25
  • 14920

三种工厂模式区别总结

工厂模式分为三种:简单工厂、工厂模式和抽象工厂模式。三者之间存在哪些异同呢?先分别看看各个模式的特点 一、     简单工厂模式: 实现了算法和界面的分离,也就是将业务逻辑和界面逻辑分开了,降低了耦...
  • lingfengtengfei
  • lingfengtengfei
  • 2013-10-07 10:40:15
  • 29906

java中的工厂模式是什么,请举例说明

工厂模式就是在接口和子类之间加入了一个过渡端,通过此过渡端获得接口的实例化对象,这个过渡端也就是所谓的工厂类。这样以后如果再有程序子类要扩充,直接修改工厂类客户端就可以根据标记得到相应的实例,增加了程...
  • maguanghui_2012
  • maguanghui_2012
  • 2015-08-02 22:11:42
  • 1836

iOS工厂模式的实质性总结

最近在公司搞分享活动,索性就分享了工厂模式这个看似大家都不重视的设计模式。实际上开发过程中用到的场景不少啊。 经过初步的了解和认识工厂之后,再去你们公司项目工程里面看看代码,肯定有不少之处用到了工厂模...
  • qq_25475307
  • qq_25475307
  • 2017-08-17 18:11:43
  • 464

对工厂模式的理解

工厂模式主要解决的问题在于降低代码耦合度,
  • ownfire
  • ownfire
  • 2014-11-07 17:29:26
  • 1617

Java设计模式之四(经典面试题:工厂模式在开发中的运用)

原地址:http://www.tuicool.com/articles/ma2I3u 面试题:        写一个简单的计算器。  代码实现: 抽象一个运算类: packa...
  • cclxh000
  • cclxh000
  • 2017-02-21 17:06:44
  • 864

Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)

提出疑问这几天研究工厂模式的时候,看到网上的一些文章中举的例子我就很疑惑,我相信这也是许多人的疑惑:工厂模式的功能就是创建实例,我们创建实例直接new不就完了吗,干嘛还得再封装一层工厂类,然后用工厂类...
  • nugongahou110
  • nugongahou110
  • 2015-12-29 13:36:59
  • 6685

一个体现Java接口及工厂模式优点的例子

本例子以操作不同类型的数据库为例: 简要说明:OracleDataOperate、SqlserverDataOperate、MysqlDataOperate,分别代表Oracle、Sqlserver、...
  • hahachinahaha
  • hahachinahaha
  • 2009-07-06 18:49:00
  • 4997

工厂模式实例(java)

 工厂模式   一、工厂模式的介绍   工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。   工厂模式的几种形态: ...
  • Elise_zhou
  • Elise_zhou
  • 2015-05-04 10:51:25
  • 2696
    个人资料
    等级:
    访问量: 3
    积分: 45
    排名: 271万+
    文章分类
    文章存档
    最新评论