剛開始做寫手上什么網(wǎng)站seo大全
享元模式(Flyweight)
享元模式是一種結(jié)構(gòu)型模式,它主要用于減少創(chuàng)建對象的數(shù)量,減少內(nèi)存占用。通過重用現(xiàn)有對象的方式,如果未找到匹配對象則新建對象。線程池、數(shù)據(jù)庫連接池、常量池等池化的思想就是享元模式的一種應(yīng)用。
圖解
角色
- 享元工廠:負(fù)責(zé)創(chuàng)建和管理享元對象,通常包含一個池用于存儲和復(fù)用已經(jīng)創(chuàng)建的享元對象
- 具體享元:實現(xiàn)抽象元接口,包含內(nèi)部和外部狀態(tài),內(nèi)部狀態(tài)可被分享,外部狀態(tài)由客戶端傳遞
- 抽象享元:定義具體享元和非共享享元接口,通常包含設(shè)置外部狀態(tài)的方法
- 客戶端:使用享元工廠獲取享元對象,并通過設(shè)置外部狀態(tài)來操作享元對象。客戶端通常不需要關(guān)心享元對象的具體實現(xiàn)
代碼實現(xiàn)
抽象享元
public interface Connection {void get();
}
具體享元
public class JdbcConnection implements Connection{private String id;public JdbcConnection(String id) {this.id = id;}@Overridepublic void get() {System.out.println("連接ID為:" + this.id);}
}
享元工廠
public class JdbcConnectionFactory {List<Connection> list = new ArrayList<>();private int count = 5;private Random random = new Random();public Connection getConnection(){if(list.size() < count){JdbcConnection jdbcConnection = new JdbcConnection(UUID.randomUUID().toString());list.add(jdbcConnection);return jdbcConnection;}else {int i = random.nextInt(4);return list.get(i);}}
}
客戶端
public class Test {public static void main(String[] args) {JdbcConnectionFactory jdbcConnectionFactory = new JdbcConnectionFactory();for (int i = 0; i < 6; i++) {Connection connection = jdbcConnectionFactory.getConnection();connection.get();}}
}
連接ID為:406ba526-7a07-41e4-9a4d-6df479aa9bce
連接ID為:f9bc31c7-77d0-4a4f-90b2-166e9656c9ac
連接ID為:81e52b30-7c49-4ffa-b6bb-dd3c0863d0b4
連接ID為:bd124c69-db5e-4a84-a9ee-1ba56fc12990
連接ID為:f953b8fd-ac5c-4988-9fec-b7660669700e
連接ID為:bd124c69-db5e-4a84-a9ee-1ba56fc12990
最多產(chǎn)生五個連接對象