Modo de fábrica y modo de agencia

Modo de fábrica

   El patrón de fábrica es uno de los patrones de diseño más utilizados en Java. Este tipo de patrón de diseño pertenece al patrón de creación, que proporciona a los desarrolladores el mejor patrón para crear objetos en teoría.
   En uso, el desarrollador solo necesita decirle que implemente qué interfaz, y el patrón de fábrica crea dinámicamente una clase de implementación para el desarrollador.Este patrón se llama proxy dinámico.

Modo de fábrica y modo de agencia

   Al usar el marco Spring, en realidad se usa IOC / Di y AOP, programación orientada a aspectos, se puede decir que estos dos son el alma de Spring.

El modelo de fábrica se puede dividir en tres categorías.

   1. El modo de fábrica simple (Fábrica simple) es una clase abstracta, sub-heredada, la clase de fábrica regresa según las condiciones (el método es estático y también se llama fábrica estática). Escalabilidad deficiente (por ejemplo, cuando se agrega una nueva herencia o se implementa una nueva instancia, es necesario modificar el método de la clase de fábrica) y los diferentes productos requieren diferentes parámetros adicionales.

   2. Modo de método de fábrica (método de fábrica) El modo de método de fábrica elimina las propiedades estáticas de la fábrica en el modo de fábrica simple, haciéndolo heredable por subclases. De esta manera, la presión sobre el método de fábrica en el patrón de fábrica simple puede ser compartida por diferentes subclases de fábrica en el patrón de método de fábrica.

   3. El patrón de fábrica abstracta (Abstract Factory) proporciona una interfaz para crear un grupo de objetos interdependientes sin especificar sus clases específicas.

Modelo de agencia

1) Proxy estático

         Cuando se utiliza un proxy estático, es necesario definir una interfaz o una clase principal. El objeto proxy y el objeto proxy implementan la misma interfaz o heredan la misma clase principal.

Simule la acción de guardar, defina una interfaz para la acción de guardar: IUserDao.java, y luego el objeto de destino implementa el método UserDao.java de esta interfaz. En este momento, si usa el método proxy estático, debe implementar el IUserDao interfaz en el objeto de proxy (UserDaoProxy.java). Al llamar, llame al objeto de destino llamando al método del objeto de proxy.
         Debe tenerse en cuenta que el objeto de proxy y el objeto de destino necesitan implementar la misma interfaz, y luego llamar al método del objeto de destino llamando al mismo método. Esto se puede hacer sin modificar el destino Bajo la premisa de la función del objeto, la función de destino se extiende.
   Desventajas: Debido a que el objeto proxy necesita implementar la misma interfaz que el destino objeto, habrá muchas clases de proxy y demasiadas clases Al mismo tiempo, una vez que la interfaz agrega métodos, tanto el objeto de destino como el objeto de proxy se mantienen.

/**
 * 接口
 */
public interface IUserDao {
    
    

    void save();
}

/**
 * 接口实现
 * 目标对象
 */
public class UserDao implements IUserDao {
    
    
    public void save() {
    
    
        System.out.println("----已经保存数据!----");
    }
}

/**
 * 代理对象,静态代理
 */
public class UserDaoProxy implements IUserDao{
    
    
    //接收保存目标对象
    private IUserDao target;
    public UserDaoProxy(IUserDao target){
    
    
        this.target=target;
    }

    public void save() {
    
    
        System.out.println("开始事务...");
        target.save();//执行目标对象的方法
        System.out.println("提交事务...");
    }
}

/**
 * 测试类
 */
public class App {
    
    
    public static void main(String[] args) {
    
    
        //目标对象
        UserDao target = new UserDao();

        //代理对象,把目标对象传给代理对象,建立代理关系
        UserDaoProxy proxy = new UserDaoProxy(target);

        proxy.save();//执行的是代理的方法
    }
}

2) Proxy dinámico

caracteristicas:

           El objeto proxy no necesita implementar la interfaz. La
generación del objeto proxy usa la API de JDK para construir dinámicamente el objeto proxy en la memoria (necesitamos especificar el tipo de interfaz implementada por el objeto proxy / objeto de destino)
       .Proxy dinámico también se llama: proxy JDK, el proxy de interfaz El proxy de
implementación de JDK solo necesita usar el método newProxyInstance, pero el método necesita recibir tres parámetros. La escritura completa es:

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

       Tenga en cuenta que este método es un método estático en la clase Proxy, y los tres parámetros recibidos están en orden:
ClassLoader loader: especifique el objeto de destino actual para usar el cargador de clases, y el método para obtener el cargador es fijo
Class <?> [ ] interfaces,: el tipo de interfaz implementada por el objeto de destino, utilice el método genérico para confirmar el tipo
InvocationHandler h: Procesamiento de eventos, cuando se ejecuta el método del objeto de destino, se activará el método del controlador de eventos y el método del objeto de destino de ejecución actual se pasará como parámetro

para resumir

   El patrón de fábrica asume principalmente la función de crear objetos en el entorno de producción, pero también oculta los detalles de creación para los desarrolladores. Su propósito es permitir que la subclase decida qué clase de fábrica instanciar a través de la interfaz del objeto creado, de modo que la generación del objeto El proceso se retrasa hasta En subcategorías. El modelo de fábrica abstracta es dar la generación de objetos de fábrica a la fábrica abstracta.

Ejemplo de demostración de código

1. Crea un objeto

public class Student {
    
    
	private  Integer id;
    private  String username;
    private  String sex;
    private  String address;
 public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getUsename() {
    
    
        return username;
    }

    public void setUsename(String usename) {
    
    
        this.username = usename;
    }

    public String getSex() {
    
    
        return sex;
    }

    public void setSex(String sex) {
    
    
        this.sex = sex;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", usename='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

2. Crea una interfaz

public interface IStudent {
    
    
		List<Student> findAll();
}

3. Crea una clase de prueba

public class Test {
    
    
    /**
     * 入门案例
     * @param args
     */
    public static void main(String[] args)throws Exception {
    
    
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user : users){
    
    
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

Archivo de configuración, consulte este artículo

Supongo que te gusta

Origin blog.csdn.net/weixin_43850343/article/details/112635624
Recomendado
Clasificación