面向对象设计模式详解(Java版)----创建型模式(5种)
面向对象设计模式详解(Java版)----三大类
1. 单例模式
说明:确保一个类只有一个实例,并提供全局访问点。常用于线程池、缓存、日志对象等全局唯一资源,避免重复创建造成开销或不一致状态。
作用:控制实例数量,节约内存,提供全局访问入口。
场景:数据库连接池、配置管理器、日志记录器。
关键点:私有构造器,线程安全(双重检查锁或静态内部类),防止反射与序列化破坏单例。
代码示例(菜单配置管理器):
public class MenuConfig {
private static MenuConfig instance;
private String shopName = "快乐汉堡店";
private MenuConfig() {}
public static synchronized MenuConfig getInstance() {
if (instance == null) instance = new MenuConfig();
return instance;
}
public String getShopName() { return shopName; }
}
public static void main(String[] args) {
MenuConfig config = MenuConfig.getInstance();
System.out.println(config.getShopName()); // 快乐汉堡店
}
2. 工厂方法模式
说明:定义创建对象的接口,但由子类决定实例化哪个具体类。将产品实例化延迟到子类,使主类不依赖具体产品,符合开闭原则。
作用:解耦产品创建与使用,支持产品族扩展。
场景:不同品牌汽车生产,日志记录器(文件或数据库)。
关键点:抽象工厂类与具体工厂子类,产品接口,符合开闭原则但对产品族扩展较弱。
代码示例(不同口味汉堡工厂):
interface Burger {
String getInfo();
}
class BeefBurger implements Burger {
public String getInfo() {
return "牛肉堡";
}
}
class ChickenBurger implements Burger {
public String getInfo() {
return "鸡肉堡";
}
}
interface BurgerFactory {
Burger create();
}
class BeefFactory implements BurgerFactory {
public Burger create() {
return new BeefBurger();
}
}
class ChickenFactory implements BurgerFactory {
public Burger create() {
return new ChickenBurger();
}
}
public class FactoryMethodDemo {
public static void main(String[] args) {
BurgerFactory factory = new BeefFactory();
Burger burger = factory.create();
System.out.println(burger.getInfo()); // 牛肉堡
}
}
3. 抽象工厂模式
说明:创建一系列相关或相互依赖的产品族,而不指定具体类。适合需要整体替换产品族(如不同操作系统界面)的场景,保证产品间兼容性。
作用:创建一组配套产品,保证产品间一致性。
场景:跨平台UI组件(Windows或Mac的按钮与输入框),不同数据库操作。
关键点:产品族扩展容易而产品等级扩展难,抽象工厂接口配合多个产品接口。
代码示例(儿童套餐与成人套餐工厂):
interface Burger {
String name();
}
interface Drink {
String name();
}
class SmallBurger implements Burger {
public String name() {
return "小汉堡";
}
}
class SmallCoke implements Drink {
public String name() {
return "小可乐";
}
}
class BigBurger implements Burger {
public String name() {
return "大汉堡";
}
}
class BigCoke implements Drink {
public String name() {
return "大可乐";
}
}
interface MealFactory {
Burger createBurger();
Drink createDrink();
}
class KidMealFactory implements MealFactory {
public Burger createBurger() {
return new SmallBurger();
}
public Drink createDrink() {
return new SmallCoke();
}
}
public class AbstractFactoryDemo {
public static void main(String[] args) {
MealFactory factory = new KidMealFactory();
Burger burger = factory.createBurger();
Drink drink = factory.createDrink();
System.out.println(burger.name() + " + " + drink.name()); // 小汉堡 + 小可乐
}
}
4. 建造者模式
说明:将复杂对象的构造与表示分离,同一构造过程可创建不同表示。通过链式调用逐步设置可选参数,清晰构建如披萨、查询请求等多属性对象。
作用:分步构建复杂对象,控制构造顺序和细节。
场景:制作披萨(尺寸、酱料、配料),SQL查询构造器,Lombok的@Builder。
关键点:指挥者、建造者接口与具体建造者,链式调用,内部静态Builder类。
代码示例(汉堡定制):
public class Hamburger {
private String size, meat, sauce;
private Hamburger(Builder b) {
this.size = b.size;
this.meat = b.meat;
this.sauce = b.sauce;
}
public static class Builder {
private String size, meat, sauce;
public Builder setSize(String size) {
this.size = size; return this;
}
public Builder setMeat(String meat) {
this.meat = meat; return this;
}
public Builder setSauce(String sauce) {
this.sauce = sauce; return this;
}
public Hamburger build() {
return new Hamburger(this);
}
}
public static void main(String[] args) {
Hamburger burger = new Hamburger.Builder()
.setSize("大").setMeat("牛肉").setSauce("番茄").build();
System.out.println(burger.getInfo()); // 大号牛肉堡+番茄
}
}
5. 原型模式
说明:通过复制现有实例来创建新对象,避免昂贵初始化。实现克隆方法区分深浅拷贝,适合创建成本高且结构相似的对象,如文档模板或图形对象。
作用:避免昂贵初始化开销,快速复制对象。
场景:文档模板克隆,图形编辑器复制图形,缓存对象复制。
关键点:实现Cloneable接口,重写clone方法,区分浅拷贝与深拷贝,原型管理器。
代码示例(汉堡模板克隆):
class BurgerPrototype implements Cloneable {
private String type;
public BurgerPrototype(String type) {
this.type = type;
}
public BurgerPrototype clone() {
try {
return (BurgerPrototype) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
public void setType(String type) {
this.type = type;
}
public static void main(String[] args) {
BurgerPrototype template = new BurgerPrototype("牛肉堡");
BurgerPrototype copy = template.clone();
copy.setType("鸡肉堡");
System.out.println(copy.getType()); // 鸡肉堡
}
}
更多推荐



所有评论(0)