修改記錄 | 修改時間 | 備注 |
---|---|---|
新建 | 20201.03.04 | 設(shè)計模式文章集合: 設(shè)計原則-SOLID、DRY橄妆、KISS衙伶、YAGNI、LOD |
單例模式
餓漢式
在類加載期間害碾,就已經(jīng)將 instance 靜態(tài)實現(xiàn)初始化好矢劲,可以保證 instance 實例的創(chuàng)建時線程安全的。不過也導致不支持延遲加載實例慌随。
public class IdGenerator(){
private IdGenerator(){}
private AtomicLong id = new AtomicLong(0);
private static final IdGenerator instance = new IdGenerator();
public static IdGenerator getInstance(){
retrun instance;
}
public long getId(){
retrun id.incrementAndGet();
}
}
懶漢式
相比較餓漢式芬沉,懶漢式支持了延遲加載躺同,但并發(fā)度極低(=1),導致頻繁的加鎖和釋放鎖丸逸,容易產(chǎn)生性能瓶頸蹋艺。
public class IdGenerator(){
private IdGenerator(){}
private AtomicLong id = new AtomicLong(0);
private static IdGenerator instance;
public static IdGenerator getInstance(){
if(instance == null){
instance = new IdGenerator();
}
retrun instance;
}
public long getId(){
retrun id.incrementAndGet();
}
}
雙重檢測
相較于懶漢式,雙重檢測既支持延遲加載支持高并發(fā)黄刚。
public class IdGenerator(){
private IdGenerator(){}
private AtomicLong id = new AtomicLong(0);
private static volatile IdGenerator instance;
public static synchronized IdGenerator getInstance(){
if(instance == null){
synchronized(IdGenerator.class){
if(instance == null){
instance = new IdGenerator();
}
}
}
retrun idGenerator;
}
public long getId(){
retrun id.incrementAndGet();
}
}
靜態(tài)內(nèi)部類
相較于雙重檢測车海,靜態(tài)內(nèi)部類方式實現(xiàn)更簡單,同時也支持延遲加載和高并發(fā)隘击。
public class IdGenerator(){
private IdGenerator(){}
private AtomicLong id = new AtomicLong(0);
private static class IdGeneratorHolder{
private static final IdGenerator singleton = new IdGenerator();
}
public static IdGenerator getInstance(){
retrun IdGeneratorHolder.singleton;
}
public long getId(){
retrun id.incrementAndGet();
}
}
枚舉類
最簡單的實現(xiàn)方式
public enum IdGenerator{
INSTANCE;
private AtomicLong id = new AtomicLong(0);
public long getId(){
retrun id.incrementAndGet();
}
}
工廠模式
工廠模式用來創(chuàng)建不同但是相關(guān)類型的對象(繼承同一父類或者接口的一組子類)侍芝,由給定的參數(shù)來決定創(chuàng)建哪種類型的對象。
簡單工廠/靜態(tài)工廠
public class ConfigParserFactory{
public static IConfigParser createParser(String configFormat){
IConfigParser parser = null;
if("json".equalsIgnoreCase(configFormat)){
parser = new JsonConfigParser();
}else if("xml".equalsIgnoreCase(configFormat)){
parser = new XmlConfigParser();
}else if("properties".equalsIgnoreCase(configFormat)){
parser = new PropertiesConfigParser();
}
return parser;
}
}
or
public class ConfigParserFactory{
private static final Map<String,IConfigParser> cacheParser = new HashMap<>();
static{
cacheParser.push("json",new JsonConfigParser());
cacheParser.push("xml",new XmlConfigParser());
cacheParser.push("properties",new PropertiesConfigParser());
}
public static IConfigParser createParser(String configFormat){
if(configFormat == null || configFormat.isEmpty){
return null;
}
retrun cacheParser.get(configFormat.toLowerCase());
}
}
工廠方法
public interface IConfigParserFactory{
IConfigParser createParser();
}
public class JsonConfigParserFactory implements IConfigParserFactory{
@Override IConfigParser createParser(){
return new JsonConfigParser();
}
}
public class XMLConfigParserFactory implements IConfigParserFactory{
@Override IConfigParser createParser(){
return new XmlConfigParser();
}
}
public class PropertiesConfigParserFactory implements IConfigParserFactory{
@Override IConfigParser createParser(){
return new PropertiesConfigParser();
}
}
public class RuleConfigParserFactoryMap{
private static final Map<String,IConfigParserFactory> cacheParser = new HashMap<>();
static{
cacheParser.push("json",new JsonConfigParserFactory());
cacheParser.push("xml",new XMLConfigParserFactory());
cacheParser.push("properties",new PropertiesConfigParserFactory());
}
public static IConfigParserFactory createParser(String configFormat){
if(configFormat == null || configFormat.isEmpty){
return null;
}
retrun cacheParser.get(configFormat.toLowerCase());
}
}
抽象工廠
public interface IConfigParserFactory {
IRuleConfigParser createRuleParser();
ISystemConfigParser createSystemParser();
//此處可以擴展新的parser類型埋同,比如IBizConfigParser
}
public class JsonConfigParserFactory implements IConfigParserFactory {
@Override
public IRuleConfigParser createRuleParser() {
return new JsonRuleConfigParser();
}
@Override
public ISystemConfigParser createSystemParser() {
return new JsonSystemConfigParser();
}
}
public class XmlConfigParserFactory implements IConfigParserFactory {
@Override
public IRuleConfigParser createRuleParser() {
return new XmlRuleConfigParser();
}
@Override
public ISystemConfigParser createSystemParser() {
return new XmlSystemConfigParser();
}
}
建造模式
建造者模式是用來創(chuàng)建復雜對象州叠,可以通過設(shè)置不同的可選參數(shù),“定制化”地創(chuàng)建不同的對象凶赁。
public class ResourcePoolConfig {
private String name;
private int maxTotal;
private int maxIdle;
private int minIdle;
private ResourcePoolConfig(Builder builder) {
this.name = builder.name;
this.maxTotal = builder.maxTotal;
this.maxIdle = builder.maxIdle;
this.minIdle = builder.minIdle;
}
//...省略getter方法...
//我們將Builder類設(shè)計成了ResourcePoolConfig的內(nèi)部類咧栗。
//我們也可以將Builder類設(shè)計成獨立的非內(nèi)部類ResourcePoolConfigBuilder。
public static class Builder {
private static final int DEFAULT_MAX_TOTAL = 8;
private static final int DEFAULT_MAX_IDLE = 8;
private static final int DEFAULT_MIN_IDLE = 0;
private String name;
private int maxTotal = DEFAULT_MAX_TOTAL;
private int maxIdle = DEFAULT_MAX_IDLE;
private int minIdle = DEFAULT_MIN_IDLE;
public ResourcePoolConfig build() {
// 校驗邏輯放到這里來做虱肄,包括必填項校驗致板、依賴關(guān)系校驗、約束條件校驗等
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("...");
}
if (maxIdle > maxTotal) {
throw new IllegalArgumentException("...");
}
if (minIdle > maxTotal || minIdle > maxIdle) {
throw new IllegalArgumentException("...");
}
return new ResourcePoolConfig(this);
}
public Builder setName(String name) {
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("...");
}
this.name = name;
return this;
}
public Builder setMaxTotal(int maxTotal) {
if (maxTotal <= 0) {
throw new IllegalArgumentException("...");
}
this.maxTotal = maxTotal;
return this;
}
public Builder setMaxIdle(int maxIdle) {
if (maxIdle < 0) {
throw new IllegalArgumentException("...");
}
this.maxIdle = maxIdle;
return this;
}
public Builder setMinIdle(int minIdle) {
if (minIdle < 0) {
throw new IllegalArgumentException("...");
}
this.minIdle = minIdle;
return this;
}
}
}
// 這段代碼會拋出IllegalArgumentException咏窿,因為minIdle>maxIdle
ResourcePoolConfig config = new ResourcePoolConfig.Builder()
.setName("dbconnectionpool")
.setMaxTotal(16)
.setMaxIdle(10)
.setMinIdle(12)
.build();