工厂模式(思维导图)

 

图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

posted on 2019-08-20 16:43  万雨  阅读(1278)  评论(0编辑  收藏  举报

导航