介绍
创建型模式是处理对象创建的设计模式,解决对象创建问题,提供实例化的方法,为适合的状况提供相应的对象创建方法.常见的创建型模式有工厂模式,建造者模式,单例模式,原型模式,对象池模式等.通过隐藏创建逻辑的方式提高了代码的可读性,扩展性,健壮性,并满足对应的场景.
工厂模式
又称为简单对象模式
本质:工厂方法代替new操作,实现创建对象的统一标准接口
生成对象的流程从:需要一个对象->创建一个对象
变成:需要一个对象->工厂来处理创建这么一个对象->返回一个对象给调用者
作用:调用者和对象解耦,创建对象标准化,隐藏对象的具体实现,减少错误修改的机会
应用场景:对象种类较多
优点:调用者创建对象只需知道对象名字通知工厂即可.且提高了扩展性,增加对象种类时只需扩展工厂创建对象的流水线,不需修改原代码即不影响原代码流程.
缺点:需要多写一些代码,一定程度上增加了系统复杂性
样例:
public class Factory{
public static Sample produce(int which){
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
抽象工厂模式
本质:工厂方法代替new操作,获取工厂和对象都统一标准接口
变成:需要一个对象->根据提供的信息选择一个具体的工厂->该工厂来处理创建该产品对象->返回一个对象给调用者
作用:调用工厂和创建对象标准化,解决对象种类更加丰富的创建对象场景
应用场景:对象种类更复杂
优点:相比简单工厂模式能应对更加复杂的创建对象场景
缺点:相比简单工厂模式更加复杂
样例:
public abstract class Factory {
Object produce(String color);
}
public class ShapeFactory implements Factory {
@Override
public Object produce(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}
public class FactoryProducer {
static ShapeFactory shapeFactory = new ShapeFactory();
static ColorFactory colorFactory = new ColorFactory();
public static Factory getFactory(String choice) {
if (choice.equalsIgnoreCase("SHAPE")) {
return shapeFactory;
} else if (choice.equalsIgnoreCase("COLOR")) {
return colorFactory;
}
return null;
}
}
Factory shapeFactory = FactoryProducer.getFactory("SHAPE");
Shape shape1 = shapeFactory.getShape("CIRCLE");
建造者模式
本质:创建对象拆分为多个步骤
变成:需要一个对象->对象构造者来多步骤创建这么一个对象->返回对象
作用:通过多个步骤一步一步构建成一个复杂的对象
应用场景:要创建对象的流程比较复杂
优点:建造者独立,易扩展,便于控制细节风险
缺点:产生多余的Builder对象
样例:
public class MealBuilder {
private meal;
MealBuilder(){
this.meal = new Meal();
}
pubilc Meal build(){
return this.meal;
}
public Meal prepareVeg (){
meal.addItem(new VegBurger());
return this;
}
public Meal prepareCoke(){
meal.addItem(new Coke());
return this;
}
}
MealBuilder mealBuilder = new MealBuilder();
Meal meal = mealBuilder.prepareVeg().prepareCoke().build();
单例模式
本质:获取对象前检查是否已存在
变成:需要一个对象->检查对象是否存在->存在则获取不存在则创建.
作用:防止全局使用的类需要频繁地创建与销毁。
应用场景:要创建全局唯一对象
方案:由两种方案饿汉模式(在类加载时就初始化)和懒汉模式(在第一次使用时才初始化,要注意加线程锁,防止有多个线程同时想获取导致创建多个对象)
原型模式
本质:直接克隆原来对象数据到新的对象
变成:需要一个对象->获取实先创建的一模一样的该对象->拷贝到新内存中->返回这新对象
作用:当创建重复对象时,比走实例化对象一个属性一个属性的分配空间赋值要快很多
应用场景:需要重复创建重复对象.
对象池模式
本质:将对象预先创建放入对象池,且对象用前取出用后放回,重复利用对象,
变成:需要一个对象->检查是否能从池子获取->能则取出来不能则创建->用完放回池子
作用:降低创建对象和销毁对象的开销
应用场景:对象池模式经常用在频繁创建、销毁对象的场景,比如数据库连接池、线程池、任务队列池等。