创建型设计模式学习

//1.Singleton 单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 
public class Single{
private staitc Single instance;
private Single(){


}
public staitc getInstance(){
if (instance==null) {
instance=new Single();
}
return instance;
}
}
//使用场景:当类只能有一个实例而且客户可以从一个众所周知的访问点来访问他时
//单例模式的重点不在于如何实现,而在于什么时候该使用单例。一般常用的如资源独占,包括文件访问、数据库访问、端口、进程控制等等,使用单例模式可有效解决访问冲突等问题。




//2.Abstract Factory 抽象工厂:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们的具体类
//工厂所能生产的产品应该能够按照至少两种方式进行分类。


//abstract factory
public interface Creator{
public ProductA createA();
public ProductB createB();
}


//concrete factory
public class Factory1 implements Creator{
public ProductA createA(){
return new ProductA1();
}
public ProductB createB(){
return new ProductB1();
}



public class Factory2 implements Creator{
public ProductA createA(){
return new ProductA2();
}
public ProductB createB(){
return new ProductB2();
}
}


//abstract product
public abstract class ProductA{


}


public abstract class ProductB{


}


//concrete product
public class ProductA1 extends ProductA{


}
public class ProductA2 extends ProductA{


}


public class ProductB1 extends ProductB{


}


public class ProductB2 extends ProductB{


}


//使用场景:系统的产品有多于一个的产品族,系统只消费其中一族中的产品。
//ProductA--->ProductA1/ProductA2
//ProductB--->ProductB1/ProductB2
//产品族1和产品族2,应该不会被同时使用




//3.Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个
//类,Factory Method使一个类的实例化延迟到了子类。


/*
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
**/


//4.Builder 建造者模式:讲一个复杂对象的构建与他的表示相互分离,使同样的构架可以得到不同的表示

//Product
public class Product {
public void doSomthing(){


}
}
//abstract Builder
public abstract class Builder{
public abstract void setPart();
public abstract Product buildProduct();
}
//concrete Builder
public class ConcreteBuilder extends Builder{
private Product product=new Product();


public void setPart(){


}


public Product buildProduct(){
return product;
}
}
// 需要注意的是,如果有多个产品类就有几个具体的建造者,而且这多个产品类具有相同接口或抽象类


public class Director{
private Builder builder=new ConcreteBuilder();
//构建不同的产品


public Product getAProduct(){
builder.setPart();
return builder.buildProduct();
}
}

//5.Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。 
//此模式的应用简单,但是要注意深度拷贝和和浅拷贝的问题。


//浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
//深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。
//换言之,深复制把要复制的对象所引用的对象都复制了一遍。
//继承自java.lang.Object类的clone()方法是浅复制.
//为了防止浅拷贝出现,原型类要实现Cloneable接口并重写clone方法。


//原型方法主要解决的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值