zoukankan      html  css  js  c++  java
  • JAVA设计模式之工厂模式

    工厂模式概念:

    实例化对象,用工厂方法代替new操作

    工厂模式包括工厂方法模式和抽象工厂模式

    抽象工厂模式是工厂方法模式的扩展

    工厂模式的意图:

    定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。

    工厂方法把实例化的工作推迟到子类中实现

    什么情况下适合工厂模式:

             有一组类似的对象需要创建

             在编码时不能预见需要创建哪种类的实例

             系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节

    工厂模式的动机:

             项目中的现状:在软件系统中经常面临着“对象”的创建工作,由于需求的变化,这个对象可能随之也会发生改变,但它却拥有比较稳定的接口。为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象不随着需求变化而变化。(做到低耦合)

     

     

    基于项目现状将代码进行如下设计:

             尽量松耦合,一个对象的依赖对象的变化与本身无关

             具体产品与客户端剥离,责任分割

    工厂方法模式和抽象工厂模式对比:

    1. 1.              工厂模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广
    2. 2.              工厂模式用来创建一个产品的等级结构,而抽象工厂模式是用来创建多个产品的等级结构
    3. 3.              工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类

    工厂模式的实现帮助我们:

    1. 1.       系统可以在不修改具体工厂角色的情况下引进新的产品
    2. 2.       客户端不必关心对象如果创建,明确了职责
    3. 3.       更好的理解面向对象的原则、面向接口编程,而不是面向实现编程

    工厂模式代码示例

    1.创建接口

    1 1 /**
    2 2  * 发型接口
    3 3  * **/
    4 4 public interface HairInterface {
    5 5     //实现了发型
    6 6     public void draw();
    7 7 }
    View Code

    2.实现接口

     1 /**
     2  * 实现接口*/
     3 public class LeftHair implements HairInterface{
     4     @Override
     5     public void draw() {
     6         System.out.println("LeftHair......");    
     7     }
     8 }
     9 public class RightHair implements HairInterface{
    10     @Override
    11     public void draw() {
    12         System.out.println("RightHair......");    
    13     }
    14 }
    View Code

    3.创建配置文件

    4.读取配置文件,并返回一个map

     1 public class PropertiesReader {
     2     public Map<String, String> getProperties(){
     3         Properties props = new Properties();
     4         Map<String, String> map = new HashMap<String, String>();
     5         try{
     6             InputStream in = getClass().getResourceAsStream("type.properties");
     7             props.load(in);
     8             Enumeration en = props.propertyNames();
     9             while(en.hasMoreElements()){
    10                 String key = (String)en.nextElement();
    11                 String property = props.getProperty(key);
    12                 map.put(key, property);    
    13             }
    14         }catch(Exception e){
    15             e.printStackTrace();
    16         }
    17         return map;
    18     }
    19 }
    View Code

    5.创建一个工厂,让工厂来创建对象

     1 public class HairFactory {
     2     /**
     3      * 根据类型来创建对象*/
     4     public HairInterface getHair(String key){
     5         if("left".equals(key)){
     6             return new LeftHair();
     7         }else if("right".equals(key)){
     8             return new RightHair();
     9         }
    10         return null;
    11     }
    12     /**
    13      * 根据类的名称来生产对象
    14      * */
    15     public HairInterface getHairByClass(String classname){
    16         try {
    17             HairInterface hair = (HairInterface) Class.forName(classname).newInstance();
    18             return hair;
    19         } catch (InstantiationException e) {
    20             e.printStackTrace();
    21         } catch (IllegalAccessException e) {
    22             e.printStackTrace();
    23         } catch (ClassNotFoundException e) {
    24             e.printStackTrace();
    25         }
    26         
    27         return null;
    28     }
    29     /**
    30      * 根据索引来产生对象*/
    31     public HairInterface getHairByClasskey(String key){
    32         try {
    33             //得到map映射
    34             Map<String, String> map = new PropertiesReader().getProperties();
    35             //根据键得到值
    36             HairInterface hair = (HairInterface) Class.forName(map.get(key)).newInstance();
    37             return hair;
    38         } catch (InstantiationException e) {
    39             e.printStackTrace();
    40         } catch (IllegalAccessException e) {
    41             e.printStackTrace();
    42         } catch (ClassNotFoundException e) {
    43             e.printStackTrace();
    44         }
    45         
    46         return null;
    47     }
    48 
    49 }
    View Code

    6.测试类

     1 public class Test {
     2     public static void main(String[] args) {
     3 //        HairInterface left = new LeftHair();
     4 //        left.draw();
     5 //        HairInterface right = new RightHair();
     6 //        right.draw();
     7 //        
     8 //        HairInterface left = new HairFactory().getHair("left");
     9 //        left.draw();
    10 //        HairInterface right = new HairFactory().getHairByClass("com.wzy.Factory_model.RightHair");
    11 //        right.draw();
    12         /**根据
    13          * 
    14          * 利用配置文件,根据索引来得到对象**/
    15     HairInterface hair = new HairFactory().getHairByClasskey("in");
    16     hair.draw();
    17 }
    18 }
    View Code
  • 相关阅读:
    MyBatis的初始化方式
    WCF X.509验证
    NPOI导出EXCEL 打印设置分页及打印标题
    一些旁门左道
    曲线救国:IIS7集成模式下如何获取网站的URL
    图片的粘贴上传
    让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库
    ASP.NET 保存txt文件
    JavaScript高级程序设计学习笔记--高级技巧
    JavaScript高级程序设计学习笔记--错误处理与调试
  • 原文地址:https://www.cnblogs.com/wwzyy/p/4959976.html
Copyright © 2011-2022 走看看