zoukankan      html  css  js  c++  java
  • [设计模式]工厂模式

    工厂模式

    工厂模式演变一:

     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 }

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

  • 相关阅读:
    关于钩子函数的详细解答:
    Vue实现回到顶部
    Vue实现Rate组件(星星评分)
    Vue-router 路由模式
    javascript中实现跨域的方式
    Promise
    webpack使用
    小程序登录
    api工厂的sdk的使用
    面试题划“重点”
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/4004537.html
Copyright © 2011-2022 走看看