博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式]工厂模式
阅读量:6364 次
发布时间:2019-06-23

本文共 4814 字,大约阅读时间需要 16 分钟。

工厂模式

工厂模式演变一:

1 package cn.itcast.factorydemo01; 2  3 //声明一个接口 4 interface Fruit { 5     //接口中定义一个eat()方法 6     public void eat(); 7 } 8 //声明两个类实现这个接口 9 class Apple implements Fruit{10     public void eat() {11         System.out.println("吃苹果");12     }13 }14 class Orange implements Fruit{15     public void eat(){16         System.out.println("吃橘子");17     }18 }19 //声明一个工厂类,用于获得一个水果Fruit的实例20 class Factory{21     public static Fruit getInstance(String className){22         Fruit f = null;23         if(className.equals("apple")){24             f = new Apple();25         }26         if(className.equals("orange")){27             f = new Orange();28         }29         return f;30     }31 }    32     33 public class FactoryDemo01 {34     public static void main(String[] args) {35         //调用工厂类Factory中的getInstance()方法36         Fruit f = Factory.getInstance("apple");37         f.eat();38     }39 }

工厂模式演变二:

1 package cn.itcast.factorydemo02; 2  3 //声明一个接口 4 interface Fruit { 5     //接口中定义一个eat()方法 6     public void eat(); 7 } 8 //声明两个类实现这个接口 9 class Apple implements Fruit{10     public void eat() {11         System.out.println("吃苹果");12     }13 }14 class Orange implements Fruit{15     public void eat(){16         System.out.println("吃橘子");17     }18 }19 20 //声明一个工厂类,用于获得一个水果Fruit的实例21     /*22     class Factory{23         public static Fruit getInstance(String className){24             Fruit f = null;25             if(className.equals("apple")){26                 f = new Apple();27             }28             if(className.equals("orange")){29                 f = new Orange();30             }31             return f;32         }33     }    34     */35 class Factory{36     public static Fruit getInstance(String className){37         Fruit f = null;38         //利用反射 由一个类的名称 得到一个类的实例对象39         try {40             f = (Fruit) Class.forName(className).newInstance();41         } catch (Exception e) {42             e.printStackTrace();43         }44         return f;45     }46 }47 public class FactoryDemo02 {48     public static void main(String[] args) {49         //调用工厂类Factory中的getInstance()方法50         //因为这个地方用到的是Class类反射生成的一个对象,所以这个地方getInstace(String name)51         //这个name对应的是一个类路径.在哪个包下的什么类中52         Fruit f = Factory.getInstance("cn.itcast.factorydemo02.Apple");53         f.eat();54     }55     //这种方式的缺点是getInstance中要书写的类的名称太长.56 }

工厂模式演变三:

1 package cn.itcast.factorydemo03; 2  3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.util.InvalidPropertiesFormatException; 9 import java.util.Properties;10 11 //声明一个接口12 interface Fruit {13     //接口中定义一个eat()方法14     public void eat();15 }16 //声明两个类实现这个接口17 class Apple implements Fruit{18     public void eat() {19         System.out.println("吃苹果");20     }21 }22 class Orange implements Fruit{23     public void eat(){24         System.out.println("吃橘子");25     }26 }27 class Factory{28     public static Fruit getInstance(String className){29         Fruit f = null;30         //利用反射 由一个类的名称 得到一个类的实例对象31         try {32             f = (Fruit) Class.forName(className).newInstance();33         } catch (Exception e) {34             e.printStackTrace();35         }36         return f;37     }38 }39 //定义一个属性操作类40 class PropertiesOperate{41     private Properties pro = null;42     //在F盘new一个文件,代码和配置文件分离,通过配置文件控制代码的运行结果,这个是工厂模式的一个重要设计思想.43     private File file = new File("F:"+File.separator+"fruit.properties");44     //构造方法45     public PropertiesOperate(){46         this.pro = new Properties();47         if(file.exists()){
//如果属性(配置)文件存在48 try {49 pro.loadFromXML(new FileInputStream(file));//读取这个文件50 } catch (Exception e) {51 e.printStackTrace();52 } 53 }else{
//如果这个属性(配置)文件不存在54 this.save();55 }56 57 }58 private void save(){59 //Properties对象pro的setProperty方法设置文件中的内容60 this.pro.setProperty("apple", "cn.itcast.factorydemo03.Apple");61 this.pro.setProperty("orange", "cn.itcast.factorydemo03.Orange");62 try {63 this.pro.storeToXML(new FileOutputStream(this.file), "Fruit");64 } catch (Exception e) {65 e.printStackTrace();66 } 67 }68 public Properties getProperties(){69 return this.pro;70 }71 }72 public class FactoryDemo03 {73 public static void main(String[] args) {74 Properties pro = new PropertiesOperate().getProperties() ;75 Fruit f = Factory.getInstance(pro.getProperty("orange"));76 f.eat();77 }78 }

=================================华丽丽的分割线=======================================

转载于:https://www.cnblogs.com/DreamDrive/p/4004537.html

你可能感兴趣的文章
CodeSmith代码生成工具介绍
查看>>
几个常用且免费的接口
查看>>
jQuery文件上传插件 Uploadify更改错误提示的弹出框
查看>>
maven 项目 pom 文件 报错org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project...
查看>>
揭秘设计模式:建造者模式(Builder)的理解和学习
查看>>
RHEL6下Apache与Tomcat整合
查看>>
我的友情链接
查看>>
CentOS Apache+MySQL+PHP
查看>>
android audio 体系结构
查看>>
【Exchange 2019 設置技巧】啟用用戶存檔
查看>>
教你如何使用U盘启动Windows 7或Windows 8
查看>>
Windows Phone WP照片视频与 Mac 同步
查看>>
linux定时任务Crond基础概念原理介绍01
查看>>
老男孩教育shell考试题猜数字游戏实战
查看>>
关于一些优秀的链接地址
查看>>
CSS display 属性详解
查看>>
Linux文件系统标准FHS
查看>>
我的友情链接
查看>>
常见的网络管理技术之snmp和端口镜像、流镜像
查看>>
abstract class与interface的差异
查看>>