zoukankan      html  css  js  c++  java
  • 工厂模式(思维导图)

     

    图1 工厂模式【点击查看大图】

      在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。

    1,非工厂模式

      自产自用,需要什么东西自己动手做的田园经济。

    辅助函数:

    package com.cnblogs.mufasa.Demo2;
    
    public interface IMessage {
        final static String VALUE="接口中的常量数据";
        public void send();
        public void send(String message);
    }
    
    public interface IService {
        public void service();
    }
    
    public class NetMessage implements IMessage {
        private String message;
        public NetMessage(){
            this.message="无参构造";
        }
        public NetMessage(String message){
            this.message=message;
        }
    
    
        public void send() {
            System.out.println(this.message+"。。。输出");
        }
        public void send(String str) {
            System.out.println(str+this.getVALUE());
        }
    
        public String getVALUE(){
            return this.VALUE;
        }
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    View Code

    非工厂的对象实例化:

    package com.cnblogs.mufasa.Demo2;
    
    public class Demo1 {
        public static void main(String[] args) throws Exception {
            IMessage msg=new NetMessage("成功");//如果直接实例化一定会有
            msg.send();
            msg.send("hello");
        }
    }
    /*输出
    【网络消息发送】www.cnblogs.com
     */

    2,简单工厂模式(Simple Factory) 

      市场经济的初级阶段,这个工厂只能生产特定不变的东西。【静态工厂】

    package com.cnblogs.mufasa.Demo2;
    
    /**
     * 静态工厂类:添加新的子类需要追加修改,标记
     */
    public class Factory {
        private Factory(){}//没有产生实例化对象的意义,所以构造方法私有化
        public static IMessage getInstance(String className){
            if("netmessage".equalsIgnoreCase(className)){
                return new NetMessage();
            }
            return null;
        }
    }

    简单工厂实例化:

    package com.cnblogs.mufasa.Demo2;
    
    public class Demo2 {
        public static void main(String[] args) throws Exception {
            IMessage msg=Factory.getInstance("NetMessage");//标准的工厂设计模式
            msg.send();
        }
    }
    /*输出
    【网络消息发送】www.cnblogs.com
     */

    3,工厂方法模式(Factory Method) 

    package com.cnblogs.mufasa.demo1;
    
    import com.cnblogs.mufasa.demo1.IMessage;
    
    public interface IFactory {
        IMessage getInstance();
    }
    
    class FactoryNetMessage implements IFactory{
        @Override
        public NetMessage getInstance() {
            return new NetMessage();
        }
    }
    package com.cnblogs.mufasa.demo1;
    
    public class Demo1 {
        public static void main(String[] args) {
            FactoryNetMessage factoryNetMessage=new FactoryNetMessage();
            NetMessage netMessage=factoryNetMessage.getInstance();
            netMessage.send("工厂方法-");
    
        }
    }

    4,抽象工厂模式(Abstract Factory) 

       将功能进行细分

    package com.cnblogs.mufasa.Demo3;
    
    public interface IFactory {
        public IMessage getMessage();
        public IService getService();
    }
    
    class Factory1 implements IFactory{
        @Override
        public IMessage getMessage() {
            return new NetMessage();
        }
    
        @Override
        public IService getService() {
            return new HouseService();
        }
    }
    
    class Factory2 implements IFactory{
        @Override
        public IMessage getMessage() {
            return new NetMessage();
        }
    
        @Override
        public IService getService() {
            return new HouseService();
        }
    }

    5,反射实现的动态工厂模式

    package com.cnblogs.mufasa.demo2;
    
    //反射实现的动态工厂类
    public class Factory2 {
        private Factory2(){}
        public static IMessage getInstance(String className) throws Exception {
            IMessage instance=null;
            try{//动态工厂类
                instance=(IMessage) Class.forName(className).getDeclaredConstructor().newInstance();
            }catch (Exception e){
                e.printStackTrace();
            }
            return instance;
        }
    }

    6,反射&泛型实现的动态工厂模式

    package com.cnblogs.mufasa.demo2;
    
    public class Factory3 {
        private Factory3(){}
    
        /**
         * 获取接口实例化对象
         * @param className 接口的子类
         * @param tClass    描述的是一个接口的类型
         * @param <T>       接口的类型【泛型】
         * @return          如果子类存在则返回指定接口的实例化对象
         * @throws Exception
         */
        public static <T> T getInstance(String className,Class<T> tClass) throws Exception {
            T instance=null;
            try{//动态工厂类
                instance=(T) Class.forName(className).getDeclaredConstructor().newInstance();
            }catch (Exception e){
                e.printStackTrace();
            }
            return instance;
        }
    }

    原文链接:https://blog.csdn.net/jason0539/article/details/23020989

    原文链接:https://blog.csdn.net/jason0539/article/details/44976775

  • 相关阅读:
    SQLServer数据库中开启CDC导致“事务日志空间被占满,原因为REPLICATION”的原因分析和解决办法
    译:SQL Server的Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息
    SQLServer中间接实现函数索引或者Hash索引
    MySQL缓存分类和配置
    MySQL系统变量配置基础
    MySQL索引统计信息更新相关的参数
    Sql Server优化---统计信息维护策略
    SQL Server 用角色(Role)管理数据库权限
    sp_executesql 或者 EXECUTE 执行动态sql的权限问题
    关于T-SQL重编译那点事,内联函数和表值函数在编译生成执行计划的区别
  • 原文地址:https://www.cnblogs.com/Mufasa/p/11383892.html
Copyright © 2011-2022 走看看