设计模式之创建型模式

本文详细介绍了Java中的三种创建型设计模式:单例模式(饿汉式和懒汉式)、抽象工厂模式以及建造者模式。单例模式确保一个类只有一个实例,提供全局访问点。抽象工厂模式则用于创建相关对象家族,而建造者模式通过步骤构建复杂对象。这些模式在软件设计中起着关键作用,提高了代码的灵活性和可维护性。
摘要由CSDN通过智能技术生成

设计模式之创建型模式

单例模式

是 Java 中最简单的设计模式之一涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

public class SingletonMode {
    //单例模式之饿汉式
    // 首先,将 new Singleton() 堵死
    private SingletonMode() {};
    //创建私有静态实例,意味着这个类第一次使用的时候就会进行创建,即提前new好,之后直接使用即可
    public static SingletonMode singletonModeHungry = new SingletonMode();
//    public static SingletonMode getInstance(){
//        return singletonModeHungry;
//    }

    //单例模式之懒汉式(和饿汉模式相比,这边不需要先实例化出来,注意这里的 volatile)
    public static volatile SingletonMode singletonModeSluggard  = null;
    public static SingletonMode getInstance(){
        if(singletonModeSluggard == null){
            //加锁
            synchronized(SingletonMode.class){
                //二次判断即双重检查
                if (singletonModeSluggard == null){
                    singletonModeSluggard = new SingletonMode();
                }
            }
        }
        return singletonModeSluggard;
    }
}
package com.xaingyang.test.dataCenter;

/**
 * @description 枚举方式进行实例化,是线程安全的,此种方式也是线程最安全的
 */
public class SingletonMode2 {

    private SingletonMode2(){}

    public static SingletonMode2 getInstance(){
        return Singleton.SINGLETON.SingletonMode2 ();
    }

    private enum Singleton{
        SINGLETON;
        private SingletonMode2 singletonMode2;

        Singleton(){
            singletonMode2 = new SingletonMode2();
        }
        public SingletonMode2 getSingletonMode2(){
            return singletonExample7;
        }
    }
}

抽象工厂模式

围绕一个超级工厂创建其他工厂,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。

//创建接口
public interface Cat {

    /**
     * 定义方法
     */
    void eat();
}
public interface Dog {

    /**
     * 定义方法
     */
    void eat();
}
//创建方法实现接口
public class BlackCat implements Cat {
    @Override
    public void eat() {
        System.out.println("吃吃吃");
    }
}
public class BlackDog implements Dog {
    @Override
    public void eat() {
        System.out.println("hehehhehh");
    }
}
public class WhiteCat implements Cat {
    @Override
    public void eat() {
        System.out.println("就吃吃吃");
    }
}
public class WhiteDog implements Dog {
    @Override
    public void eat() {
        System.out.println("heheaihisahdiasndiaiadd");
    }
}
//创建抽象工厂
/**
 *这个接口就是类图中标识的
 *  AbstractFactory抽象工厂
 */
public interface AnimalFactory {
    /**
     * 定义创建Icat接口实例的方法
     */
     Cat creatCat();
    /**
     * 定义创建Idog接口实例的方法
     */
     Dog creatDog();
}
//实现抽象工厂
public class BlackAnimalFactory implements AnimalFactory {
    @Override
    public Cat creatCat() {
        return new BlackCat();
    }

    @Override
    public Dog creatDog() {
        return new BlackDog();
    }
}
public class WhiteAnimalFactory implements AnimalFactory {
    @Override
    public Cat creatCat() {
        return new WhiteCat();
    }

    @Override
    public Dog creatDog() {
        return new WhiteDog();
    }
}
//测试类
public static void main(String[] args) {
       BlackAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
       Cat iCat = blackAnimalFactory.creatCat();
       iCat.eat();
       Dog iDog = blackAnimalFactory.creatDog();
       iDog.eat();

       WhiteAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
       whiteAnimalFactory.creatCat().eat();
       whiteAnimalFactory.creatDog().eat();
}

建造者模式

使用多个简单的对象一步一步构建成一个复杂的对象,一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

/**
 * Created by xiangyang on 2021/1/14
 * 建造者模式
 */
public class BuilderPattern {
    //属性
    private String name;
    private String password;
    private String nickName;
    private int age;
    // 构造方法私有化,不然客户端就会直接调用构造方法了
    private BuilderPattern(String name,String password,String nickName,int age){
        this.name = name;
        this.password = password;
        this.nickName = nickName;
        this.age = age;
    }
    // 静态方法,用于生成一个 Builder,这个不一定要有,不过写这个方法是一个很好的习惯,
    // 有些代码要求别人写 new User.UserBuilder().a()...build() 看上去就没那么好
    public static UserBuilder builder() {
        return new UserBuilder();
    }
    public static class UserBuilder {
        //属性
        private String name;
        private String password;
        private String nickName;
        private int age;
        private UserBuilder(){}
        // 链式调用设置各个属性值,返回 this,即 UserBuilder
        public UserBuilder name(String name) {
            this.name = name;
            return this;
        }
        public UserBuilder password(String password) {
            this.password = password;
            return this;
        }
        public UserBuilder nickName(String nickName) {
            this.nickName = nickName;
            return this;
        }
        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }
        // build() 方法负责将 UserBuilder 中设置好的属性“复制”到 User 中。
        // 当然,可以在 “复制” 之前做点检验
        public BuilderPattern build() {
            if (name == null || password == null) {
                throw new RuntimeException("用户名和密码必填");
            }
            if (age <= 0 || age >= 150) {
                throw new RuntimeException("年龄不合法");
            }
            // 还可以做赋予”默认值“的功能
            if (nickName == null) {
                nickName = name;
            }
            System.out.println(name);
            return new BuilderPattern(name, password, nickName, age);

        }
        public static void main(String[] args) {
            BuilderPattern d = BuilderPattern.builder()
                    .name("foo")
                    .password("pAss12345")
                    .age(25)
                    .build();
        }
    }
}

原型模式

用于创建重复的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

  /**
     * 原型类,
     */
    public class Prototype implements Cloneable {
        private String name;
        public void setName(String name) {
              this.name = name;
        }
        public String getName() {
			return this.name;
		}
        public Object clone() {
			try {
				return super.clone();
			} catch (Exception e) {
				e.printStackTrace();
				return null;
            }
        }
    }
    /**
     * 原型类的子类
     */
    public class ConcretePrototype extends Prototype {
	public ConcretePrototype(String name) {
			setName(name);
	}
}
    /**
     * 测试类
     */
    public class Test {
	public static void main(String[] args) {
		Prototype pro = new ConcretePrototype("prototype");
		Prototype pro2 = (Prototype)pro.clone();
		System.out.println(pro.getName());
		System.out.println(pro2.getName());
		}
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值