工厂模式

定义了一个床架对象的接口,但由子类决定实例化的类是哪一个,工厂方法让类的实例化推迟到子类中。

Pizza 案例

Pizza 店需要生产 Pizza,如果直接用 new 的方式,不利用扩展。我们要封装变化

  1. // 这样太“硬”编码了,不利用扩展
  2. Pizza pizza = new ItalyPizza();

简单工厂

简单工厂不是一种设计模式,更像是一种编程习惯。

  1. // 简单工厂 示例
  2. public class SimplePizzaFactory {
  3. public Pizza createPizza(String type) {
  4. Pizza pizza = null;
  5. if (type.equals("")) {
  6. }else if (type.equals("")) {
  7. }else if (type.equals("")) {
  8. }
  9. return pizza;
  10. }
  11. }

工厂方法模式

工厂方法是抽象的,依赖子类来完成动作。必须返回一个产品。

  1. abstract Product createProduct(String type);

工厂模式特点

  1. 封装变化,将变化的部分独立出来进行封装
  2. 不确定的推迟,利用多态,在不确定类的情况下,将类延迟到子类来决定具体的类
  3. 封装变化,延迟处理,使得代码扩展性很强

    单例模式

    确保一个类只有一个实例,并提供全局访问带你。

最简单的一种实现,存在多线程问题

  1. public class Singleton {
  2. private static Singleton unqueInstance = null;
  3. public static Singleton getInstance() {
  4. if (unqueInstance == null) {
  5. return new Singleton();
  6. }
  7. return unqueInstance;
  8. }
  9. }

加 synchronized,存在性能问题

  1. public class Singleton {
  2. private static Singleton unqueInstance = null;
  3. public static synchronized Singleton getInstance() {
  4. if (unqueInstance == null) {
  5. return new Singleton();
  6. }
  7. return unqueInstance;
  8. }
  9. }

饿汉式,存在浪费资源的问题

  1. public class Singleton {
  2. private static Singleton uniqueInstance = new Singleton();
  3. public static Singleton getInstance() {
  4. return uniqueInstance;
  5. }
  6. }

懒汉式,双重锁检查

  1. public class Singleton {
  2. private static volatile Singleton uniqueInstance = null;
  3. private Singleton() {
  4. }
  5. public static Singleton getInstance() {
  6. if (uniqueInstance == null) {
  7. synchronized (Singleton.class) {
  8. if (uniqueInstance == null) {
  9. uniqueInstance = new Singleton();
  10. }
  11. }
  12. }
  13. return uniqueInstance;
  14. }
  15. }