设计模式之创建型模式

介绍

创建型模式是处理对象创建的设计模式,解决对象创建问题,提供实例化的方法,为适合的状况提供相应的对象创建方法.常见的创建型模式有工厂模式,建造者模式,单例模式,原型模式,对象池模式等.通过隐藏创建逻辑的方式提高了代码的可读性,扩展性,健壮性,并满足对应的场景.

工厂模式

又称为简单对象模式
本质:工厂方法代替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();

单例模式

本质:获取对象前检查是否已存在
变成:需要一个对象->检查对象是否存在->存在则获取不存在则创建.
作用:防止全局使用的类需要频繁地创建与销毁。
应用场景:要创建全局唯一对象
方案:由两种方案饿汉模式(在类加载时就初始化)和懒汉模式(在第一次使用时才初始化,要注意加线程锁,防止有多个线程同时想获取导致创建多个对象)

原型模式

本质:直接克隆原来对象数据到新的对象
变成:需要一个对象->获取实先创建的一模一样的该对象->拷贝到新内存中->返回这新对象
作用:当创建重复对象时,比走实例化对象一个属性一个属性的分配空间赋值要快很多
应用场景:需要重复创建重复对象.

对象池模式

本质:将对象预先创建放入对象池,且对象用前取出用后放回,重复利用对象,
变成:需要一个对象->检查是否能从池子获取->能则取出来不能则创建->用完放回池子
作用:降低创建对象和销毁对象的开销
应用场景:对象池模式经常用在频繁创建、销毁对象的场景,比如数据库连接池、线程池、任务队列池等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值