单例模式
概念:
确保一个类只有一个实例,而且自行实例化并向震哥哥系统提供这个实例
应用:
无状态的,一般以工具类形式,进行提供
代码:
懒汉式,双重检查锁
class Singleton {private static volatile Singleton instance = null;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
备注:使用volatile修饰,是因为new Singleton()可以拆解为3步:
1、分配内存
2、初始化对象
3、指向刚分配的地址
若发生重排序,假设A线程执行了1和3,还没有执行2,B线程来到判断NULL时,不为NULL,B线程就会直接返回还没有初始化的instance了。volatile可以避免重排序
简单工厂模式
概念:
又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同,返回不同类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
应用:
不够灵活,新增产品需要修改工厂类;
优点在于实现对象的创建和使用分离
代码:
public class SimpleFactory {public static Product createProduct(String type){if (type.equals("A")){return new ProductA();} else {return new ProductB();}}public static void main(String[] args) {Product p = SimpleFactory.createProduct("A");p.print();}
}abstract class Product{public abstract void print();
}class ProductA extends Product{@Overridepublic void print(){System.out.println("A");}}class ProductB extends Product{@Overridepublic void print(){System.out.println("B");}
}
工厂模式
概念:
定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类
应用:
代码:
// 定义产品接口
interface Shape {void draw();
}// 具体产品1
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}// 具体产品2
class Square implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Square");}
}// 定义工厂接口
interface ShapeFactory {Shape createShape();
}// 具体工厂1
class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}// 具体工厂2
class SquareFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Square();}
}// 客户端代码
public class FactoryMethodDemo {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape circle = circleFactory.createShape();circle.draw();ShapeFactory squareFactory = new SquareFactory();Shape square = squareFactory.createShape();square.draw();}
}
抽象工厂模式
概念:
一种更高级的工厂模式,用于创建相关或依赖对象的家族,而无需明确指定具体类
代码:
// 定义产品接口1
interface Shape {void draw();
}// 定义产品接口2
interface Color {void fill();
}// 具体产品1
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}// 具体产品2
class Square implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Square");}
}// 具体产品3
class RedColor implements Color {@Overridepublic void fill() {System.out.println("Filling with Red Color");}
}// 具体产品4
class BlueColor implements Color {@Overridepublic void fill() {System.out.println("Filling with Blue Color");}
}// 定义抽象工厂接口
interface AbstractFactory {Shape getShape(String shapeType);Color getColor(String colorType);
}// 具体工厂1
class ShapeFactory implements AbstractFactory {@Overridepublic Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("SQUARE")) {return new Square();}return null;}@Overridepublic Color getColor(String colorType) {return null;}
}// 具体工厂2
class ColorFactory implements AbstractFactory {@Overridepublic Shape getShape(String shapeType) {return null;}@Overridepublic Color getColor(String colorType) {if (colorType == null) {return null;}if (colorType.equalsIgnoreCase("RED")) {return new RedColor();} else if (colorType.equalsIgnoreCase("BLUE")) {return new BlueColor();}return null;}
}// 工厂生成器
class FactoryProducer {public static AbstractFactory getFactory(String choice) {if (choice == null) {return null;}if (choice.equalsIgnoreCase("SHAPE")) {return new ShapeFactory();} else if (choice.equalsIgnoreCase("COLOR")) {return new ColorFactory();}return null;}
}// 客户端代码
public class AbstractFactoryDemo {public static void main(String[] args) {AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");Shape shape1 = shapeFactory.getShape("CIRCLE");shape1.draw();Shape shape2 = shapeFactory.getShape("SQUARE");shape2.draw();AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");Color color1 = colorFactory.getColor("RED");color1.fill();Color color2 = colorFactory.getColor("BLUE");color2.fill();}
}