设计模式(总结)---创建型设计模式

创建型设计模式:
工厂方法

https://blog.csdn.net/define_us/article/details/82966710

原型模式
利用已经存在的对象创建新的对象
在java中,只有实现了cloneable的接口才可以被拷贝。
原型模式的好处式简化了对象的创建,实现了对对象的赋值粘贴。而且采用clone要比new的执行效率高。

class Prototype implements Cloneable {
	public Prototype clone(){
		Prototype prototype = null;
		try{
			prototype = (Prototype)super.clone();
		}catch(CloneNotSupportedException e){
			e.printStackTrace();
		}
		return prototype; 
	}
}

class ConcretePrototype extends Prototype{
	public void show(){
		System.out.println("原型模式实现类");
	}
}

public class Client {
	public static void main(String[] args){
		ConcretePrototype cp = new ConcretePrototype();
		for(int i=0; i< 10; i++){
			ConcretePrototype clonecp = (ConcretePrototype)cp.clone();
			clonecp.show();
		}
	}
}

注意一些问题,首先,java的克隆是在object类中实现的,不会调用构造函数,值会自动克隆,也就是浅拷贝。如果要实现深拷贝,必须在上述例子中的clone函数手动添加。
由于clone函数在object中是protected,所以如果不使用重载将clone方法的权限改成public,将无法实现拷贝

单例模式
对于某些对象,我们只需要一个,如果产生多个会出现很多问题。
单例模式可以保证一个类只有一个实例而且便于访问。如果采用全局变量可以便于访问,但仍然无法避免该类只被创建一次
有如下三种实现方案:
(1)利用静态变量记录

public class Singleton {
	//利用静态变量来记录Singleton的唯一实例
	private static Singleton uniqueInstance;
	
	/*
	 * 构造器私有化,只有Singleton类内才可以调用构造器
	 */
	private Singleton(){
		
	}
	
	public static synchronized Singleton getInstance(){
		if(uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		
		return uniqueInstance;
	}
	
}

首先第一步,构造器必须被私有化。

(2)直接初始化静态变量
public class Singleton {
/*
* 利用静态变量来记录Singleton的唯一实例
* 直接初始化静态变量,这样就可以确保线程安全了(静态变量在第一次被加载时唯一被初始化)
*/
private static Singleton uniqueInstance = new Singleton();

/*
 * 构造器私有化,只有Singleton类内才可以调用构造器
 */
private Singleton(){
	
}

public static Singleton getInstance(){
	return uniqueInstance;
}

}
(3)双重加锁,使用同步

public class Singleton {
	/*
	 * 利用静态变量来记录Singleton的唯一实例
	 * volatile 关键字确保:当uniqueInstance变量被初始化成Singleton实例时,
	 * 多个线程正确地处理uniqueInstance变量
	 * 
	 */
	private volatile static Singleton uniqueInstance;
	
	/*
	 * 构造器私有化,只有Singleton类内才可以调用构造器
	 */
	private Singleton(){
		
	}
	
	/*
	 * 
	 * 检查实例,如果不存在,就进入同步区域
	 */
	public static Singleton getInstance(){
		if(uniqueInstance == null){
			synchronized(Singleton.class){    //进入同步区域
				if(uniqueInstance == null){     //在检查一次,如果为null,则创建
					uniqueInstance  = new Singleton();
				}
			}
		}
		
		return uniqueInstance;
	}
	
}

单例模式封装了唯一的实例,还可以添加代码更加唯一的控制客户如何进行访问。
缺点是单例模式可能会被滥用。

建造者模式
建造者模式将一个复杂对象的构建和他的表示分离。和工厂模式类似,只不过工厂说模式侧重于产生不同的产品,而建造者模式侧重于产生相同产品的不同流程。适用于创建对象时的算法复杂的情况。

#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
//Product类
class Product
{
    vector<string> parts;
public:
    void Add(const string part)
    {
        parts.push_back(part);
    }
    void Show()const
    {
        for(int i = 0 ; i < parts.size() ; i++)
        {
            cout<<parts[i]<<endl;
        }
    }
};
//抽象builder类
class Builder
{
public:
    virtual void BuildHead() = 0;
    virtual void BuildBody() = 0;
    virtual void BuildHand() = 0;
    virtual void BuildFeet() = 0;
    virtual Product GetResult() = 0; 
};
//具体胖人创建类
class FatPersonBuilder :public Builder
{
private:
    Product product;
public:
    virtual void BuildHead()
    {
        product.Add("胖人头");//创建瘦人的头
    }
    virtual void BuildBody()
    {
        product.Add("胖人身体");//创建瘦人的身体
    }
    virtual void BuildHand()
    {
        product.Add("胖人手");//创建瘦人的手
    }
    virtual void BuildFeet()
    {
        product.Add("胖人脚");//创建瘦人的脚
    }
    virtual Product GetResult()
    {
        return product;
    }
};
//具体瘦人人创建类
class ThinPersonBuilder :public Builder
{
private:
    Product product;
public:
    virtual void BuildHead()
    {
        product.Add("瘦人人头");//创建瘦人的头
    }
    virtual void BuildBody()
    {
        product.Add("瘦人身体");//创建瘦人的身体
    }
    virtual void BuildHand()
    {
        product.Add("瘦人手");//创建瘦人的手
    }
    virtual void BuildFeet()
    {
        product.Add("瘦人脚");//创建瘦人的脚
    }
    virtual Product GetResult()
    {
        return product;
    }
};
//Director类
class Director
{
public:
    void Construct(Builder &builder)
    {
        builder.BuildHead();
        builder.BuildBody();
        builder.BuildHand();
        builder.BuildFeet();
    }
};

int main()
{
    Director *director = new Director();
    Builder *b1 = new FatPersonBuilder();
    Builder *b2 = new ThinPersonBuilder();

    director->Construct(*b1);
    Product p1 = b1->GetResult();
    p1.Show(); 
    return 0;
}

将如上代码汇之味类图为
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值