浅谈设计模式之单例模式和工厂模式

单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

关键代码:构造函数是私有的。让构造函数为 private,这样该类就不会被实例化。

饿汉式

在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。

//饿汉式单例类.在类初始化时,已经自行实例化   
public class Singleton {  
     //私有的默认构造子  
     private Singleton() {}  
     //已经自行实例化   
     private static Singleton single = new Singleton();  
     //静态工厂方法   
     public static Singleton getInstance() {  
         return single;  
    }  
}  

懒汉式

当程序第一次访问单件模式实例时才进行创建。

//懒汉式单例类.在第一次调用的时候实例化   
public class Singleton2 {  
     //私有的默认构造子  
     private Singleton2() {}  
     //注意,这里没有final      
     private static Singleton2 single=null;  
     //静态工厂方法   
     public synchronized  static Singleton2 getInstance() {  
          if (single == null) {    
              single = new Singleton2();  
          }    
         return single;  
    }  
}

工厂模式

工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口。

工厂方法

工厂方法模式通过一个抽象的工厂类来创建工厂,再由工厂通过一定的方法创造一定的对象,这样如果有新的产C出现不需要修改已有代码只要新建一个产品的从子类和工厂的子类就可以啦,简单代码如下:

//抽象工厂类
abstract class Factory{
    abstract Product create();
}
//工厂A
class FactoryA{
    public Product create(){
        return new ProductA();
    };
}
//工厂B
class FactoryB{
    public Product create(){
        return new ProductA();
    };
}
//产品父类
abstract class Product{}
//产品子类A
class ProductA extends Product{}
//产品子类B
class ProductB extends Product{}

public class App{
    public static void main(String[] args){
        Product p;
        Factory f=new FactoryA()
        //消费者类中创造A产品
        p=f.create();
    }
}

-----------------------傻子这样写??

抽象工厂模式

抽象工厂模式较好的实现了“开放-封闭”原则,是三个模式中较为抽象,并具一般性的模式。我们在使用中要注意使用抽象工厂模式的条件。

//工厂里嵌套工厂,用不同工厂生产不同商品
class Program
{
    static void Main(string[] args)
    {
        //实例化惠普鼠标工厂
        Factory factory = new HPFactory();
        string mouseInfo1 = factory.GetMouseFactory().GetMouseInfo();
        string keyboard1 = factory.GetKeyboardFactory().GetKeyboardInfo();

        //实例化联想鼠标工厂
        Factory factory2 = new LenoveFactory();
        string mouseInfo2 = factory2.GetMouseFactory().GetMouseInfo();
        string keyboard2= factory2.GetKeyboardFactory().GetKeyboardInfo();

    }
}
//工厂创造不同的商品,用同一工厂生产不同商品
interface IProduct1 {
  public void show();
}
interface IProduct2 {
  public void show();
}
class Product1 implements IProduct1 {
  public void show() {
    System.out.println("这是1型产品");
  }
}
class Product2 implements IProduct2 {
  public void show() {
    System.out.println("这是2型产品");
  }
}
interface IFactory {
  public IProduct1 createProduct1();
  public IProduct2 createProduct2();
}
class Factory implements IFactory{
  public IProduct1 createProduct1() {
    return new Product1();
  }
  public IProduct2 createProduct2() {
    return new Product2();
  }
}
public class Client {
  public static void main(String[] args){
    IFactory factory = new Factory();
    factory.createProduct1().show();
    factory.createProduct2().show();
  }
}

猜你喜欢

转载自blog.csdn.net/bjmsb/article/details/107125369