ファクトリーモード
ファクトリパターンは、Javaで最も一般的に使用されるデザインパターンの1つです。このタイプのデザインパターンは、理論的にオブジェクトを作成するための最良のパターンを開発者に提供する作成パターンに属します。
使用中、開発者はどのインターフェイスを実装するかを指示するだけでよく、ファクトリパターンは開発者の実装クラスを動的に作成します。このパターンは動的プロキシと呼ばれます。
ファクトリーモードとエージェンシーモード
Springフレームワークを使用する場合、実際にはIOC / DiとAOP、アスペクト指向プログラミングを使用することになります。これら2つはSpringの魂であると言えます。
工場モデルは3つのカテゴリーに分けることができます
1. Simple Factoryモード(Simple Factory)は、サブ継承された抽象クラスであり、ファクトリクラスは条件に従って戻ります(メソッドは静的であり、静的ファクトリとも呼ばれます)。スケーラビリティが低く(たとえば、新しい継承を追加したり、新しいインスタンスを実装したりする場合は、ファクトリクラスのメソッドを変更する必要があります)、製品ごとに異なる追加パラメータが必要になります。
2.ファクトリメソッドモード(ファクトリメソッド)ファクトリメソッドモードは、シンプルファクトリモードのファクトリの静的プロパティを削除し、サブクラスで継承できるようにします。このようにして、単純なファクトリパターンのファクトリメソッドへの圧力を、ファクトリメソッドパターンのさまざまなファクトリサブクラスで共有できます。
3.抽象ファクトリパターン(抽象ファクトリ)は、特定のクラスを指定せずに相互依存オブジェクトのグループを作成するためのインターフェイスを提供します。
エージェンシーモデル
1)静的プロキシ
静的プロキシを使用する場合は、インターフェイスまたは親クラスを定義する必要があります。プロキシオブジェクトとプロキシオブジェクトは、同じインターフェイスを実装するか、同じ親クラスを継承します。
保存アクションをシミュレートし、保存アクションのインターフェースIUserDao.javaを定義すると、ターゲットオブジェクトはこのインターフェースのメソッドUserDao.javaを実装します。このとき、静的プロキシメソッドを使用する場合は、IUserDaoを実装する必要があります。プロキシオブジェクト(UserDaoProxy.java)のインターフェイス。呼び出すときは、プロキシオブジェクトのメソッドを呼び出してターゲットオブジェクトを呼び出します。
プロキシオブジェクトとターゲットオブジェクトは同じインターフェイスを実装してから、を呼び出す必要があることに注意してください。同じメソッドを呼び出すことにより、ターゲットオブジェクトのメソッド。これは、ターゲットを変更せずに実行できます。オブジェクトの機能を前提として、ターゲット関数が拡張されます。
短所:プロキシオブジェクトはターゲットと同じインターフェイスを実装する必要があるため。オブジェクトの場合、プロキシクラスが多すぎてクラスが多すぎます。同時に、インターフェイスがメソッドを追加すると、ターゲットオブジェクトとプロキシオブジェクトの両方が維持されます。
/**
* 接口
*/
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)動的プロキシ
特徴:
プロキシオブジェクトはインターフェイスを実装する必要はありません。プロキシオブジェクトの
生成では、JDK APIを使用して、メモリ内にプロキシオブジェクトを動的に構築します(プロキシオブジェクト/ターゲットオブジェクトによって実装されるインターフェイスのタイプを指定する必要があります)。
動的プロキシJDKプロキシとも呼ばれます。インターフェイスプロキシ
JDK実装プロキシはnewProxyInstanceメソッドのみを使用する必要がありますが、メソッドは3つのパラメータを受け取る必要があります。完全な記述は次のとおりです。
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
このメソッドはProxyクラスの静的メソッドであり、受け取った3つのパラメーターは順番になっていることに注意してください
。ClassLoaderローダー:クラスローダーを使用する現在のターゲットオブジェクトを指定し、ローダーを取得するメソッドは固定されています
Class <?> [ ] interfaces 、:ターゲットオブジェクトによって実装されるインターフェイスのタイプ。汎用メソッドを使用してタイプを確認します
。InvocationHandlerh:イベント処理、ターゲットオブジェクトのメソッドが実行されると、イベントハンドラのメソッドがトリガーされます。現在の実行ターゲットオブジェクトのメソッドがパラメータとして渡されます
総括する
ファクトリパターンは、主に本番環境でオブジェクトを作成する役割を担いますが、開発者には作成の詳細を隠します。その目的は、作成されたオブジェクトのインターフェイスを介してインスタンス化するファクトリクラスをサブクラスに決定させ、オブジェクトの生成を行うことです。プロセスは、サブカテゴリ内まで遅延されます。抽象ファクトリモデルは、ファクトリオブジェクトの生成を抽象ファクトリに与えることです。
コードのデモンストレーション例
1.オブジェクトを作成します
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.インターフェースを作成します
public interface IStudent {
List<Student> findAll();
}
3.テストクラスを作成します
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();
}
}