zoukankan      html  css  js  c++  java
  • 研磨设计模式----工厂模式

    简单工厂模式

    为什么要使用简单工厂模式:

    如果像书上所写用:Api api=new Impl();客户端就知道了接口和实现的类。想想接口的思想是隔离封装。客户端不能知道Impl这个类的。但是这又会造成只知接口而不知其实现的问题。所以诞生了简单工厂。

    简单工厂的定义:提供一个创建实例的功能,而无须其内部实现

    上代码

    可能有的朋友会觉得只是把一个new impl()移到了工厂内部。但是我只能这个问题理解的重点是理解简单工厂的位置

    这幅图很好的展示了简单工厂的原理。在客户端只知道接口和工厂类。但是并不知道被包围在虚线框内的实现类。这样就实现了客户不知道实现但是能创建接口实例了

    简单工厂的认识:

    1.用来造东西的,造接口,抽象类,实例都可以啦

    2.不用创建简单工厂的实例,内部的方法都是静态的。还有将构造方法设为私有,防止客户乱造工厂

    3.简单工厂什么都能造,但是最好不要把所有的创建工作都交给一个工厂做。有点像大杂烩,一般以一个模块为主。

    简单工厂命名建议:

    1.类名建议:模块+Factory。如UserFactory

    2.方法名:“get+接口名称”或“create+接口名称”如getUser()或createUser();

    但是用以上方法。必须传入一个参数。用户必须知道参数的意思,所以还是一定暴露了实现

    如果想要添加一种新的实现而不修改代码。可用可配置工厂模式。用xml文件来创建类

    可配置的工厂:

     package factorymodel;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    class MessageAImpl implements MessageA {
    
    @Override
    public void messagePrint() {
    System.out.println("A");
    }
    }
    
    class MessageBImpl implements MessageB {
    
    @Override
    public void messagePrintB() {
    System.out.println("B");
    }
    }
    
    public class FactorySettle {
    public static MessageA createMessageA() {
    Properties properties = new Properties();
    InputStream in = null;
    //取得java.properties的资源
    try {
    in = FactorySettle.class.getResourceAsStream("/java.properties");
    
    properties.load(in);
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    
    in.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    MessageA messageA = null;
    try {
    messageA = (MessageA) Class.forName(properties.getProperty("javaclass")).newInstance();
    System.out.println("messagea");
    return messageA;
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (InstantiationException e) {
    e.printStackTrace();
    }
    System.out.println("create messageA fail");
    return null;
    }
    
    public static void main(String[] args) {
    MessageA messageA=FactorySettle.createMessageA();
    messageA.messagePrint();
    }
    }
    

     

    这样就不用修改源代码,直接改配置文件就好了。

    没有虚过一天,真好
  • 相关阅读:
    17种高效选聘方法
    三招让你从求职者中脱颖而出(转)
    仓山有感
    同事就是同事,职场没有兄弟姐妹
    enable worker process
    央企
    关于IIS
    td
    About Application Pool
    iis 7 application pool
  • 原文地址:https://www.cnblogs.com/dailinfu/p/6648273.html
Copyright © 2011-2022 走看看