创建型模式
设计模式【GoF23】
是一套用来提高代码复用性、可维护性、可读性、稳健性以及安全性的解决方案。
优点:①提高程序员的思维能力、编程能力和设计能力。②使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
类型 | 模式 |
---|---|
创建型模式 | 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式 |
结构型模式 | 适配器模式、桥接模式 、装饰模式、组合模式、外观模式、享元模式、代理模式 |
行为型模式 | 模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式 |
OOP七大原则:
- 开比原著:对扩展开放,对修改关闭
- 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍成立
- 依赖倒置原则:要面向接口,不要面向实现编程
- 单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性
- 接口隔离原则:要为各个类建立他们专用的接口
- 迪米特法则:只与你的直接朋友交谈
- 合成复用原则:尽量先使用组合或聚合等关联关系来实现,其次才考虑使用继承关系来实现
1.单例模式
-
饿汉式单例:直接加载对象,浪费空间
-
懒汉式单例【DCL】:实例为空时才创建,在多线程下会发生错误,因此需要双重检测锁控制
2.工厂模式与抽象工厂模式
-
作用:实现创建者与调用者分离
-
分类:简单工厂模式、工厂方法模式
模式 | 特点 | 代码实现 |
---|---|---|
简单工厂模式 | 用来生产同一等级结构中的任意产品 | |
工厂方法模式 | 用来生产同一等级结构中的固定产品 | |
抽象工厂模式 | 围绕一个超级工厂创建其他工厂 |
3.建造者模式
-
作用:在用户不知道对象的构造过程和细节的情况下可以直接创建复杂的对象
-
例子:工厂(建造者模式):负责制造汽车,组装过程在工厂内部;汽车购买者:通过对象的类型和内容直接购买使用即可
-
作用:实现创建者与调用者分离
-
建造者与抽象工厂模式的比较:
* 1.与抽象工厂相比,建造者模式返回一个组装好的完整产品,而抽象工厂返回一系列相关的产品,这些产品位于不同的产品等级结构,构成一个产品族 * 2.在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需的产品对象,而建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者来指导如何生成对象,包括对象组装过程和建造步骤,侧重于一步步构造一个复杂对象返回一个完整的对象。 * 3.如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。
-
代码实现:
//抽象的建造者
public abstract class Builder{
abstract void builder1(); //地基
abstract void builder2(); //钢筋工程
abstract void builder3(); //铺电线
abstract void builder4(); //粉刷
//得到产品
abstract Product getProduct();
}
//产品:房子
public class Product{
private String builder1;
private String builder1;
private String builder1;
private String builder1;
public String getBuilder1(){
return builder1;
}
public void setBuilder1(String builder){
this.builder = builder1;
}
public String getBuilder2(){
return builder2;
}
public void setBuilder2(String builder){
this.builder = builder2;
}
public String getBuilder3(){
return builder3;
}
public void setBuilder3(String builder){
this.builder = builder3;
}
public String toString(){
return "Product("+
"builder1="+builder1+'\''+
"builder2="+builder2+'\''+
"builder3="+builder3+'\''+
"builder4="+builder4+'\''+
'}';
}
}
//具体的建造者:工人
public class Worker extends Builder{
private Product product;
public Worker(){
product = new Product();
}
void builder1(){
product.setBuilder1("地基");
}
void builder1(){
product.setBuilder1("钢筋工程");
}
void builder1(){
product.setBuilder1("铺电线");
}
void builder1(){
product.setBuilder1("粉刷");
}
Product getProduct(){
return product;
}
}
//指挥:核心
public class Director{
public Product build(Builder builder){
builder.builder1();
builder.builder2();
builder.builder3();
builder.builder4();
return builder.getProduct();
}
}
//测试
public class Test{
public static void main(String[] args){
Director director = new Director();
Product builder = director.builder(new Worker());
System .out.println(builder.toString());
}
}
4.原型模式
-
实现copy《克隆》
//1.实现一个接口 Cloneable;2.重写一个方法 Clone()
public class Video implements Cloneable {
private String name;
private Date creatTime;
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Video(){}
public Video(String name,Date createTime){
this.name = name;
this.createTime = createTime;
}
public getName(){
return name;
}
public setName(String name){
this.name = name;
}
public getCreateTime(){
return createTime;
}
public setCreateTime(Date createTime){
this.createTime = createTime;
}
}
public class newClone{
publlic static void main(String[] main){
//创建原型对象
Date date = new Date();
Video v1 = new Video("LL",date);
System.out.println("v1--"+v1);
System.out.println("v1--hash"+v1.hashCode());
//
Video v2 = (Video)v1.clone();
System.out.println("v2--"+v2);
System.out.println("v2--hash"+v2.hashCode());
}
}
创建型模式完结