设计模式

一、单例模式

       确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式的主要作用是确保一个类只有一个实例存在。比如说序列号生成器、Web页面的计数器等等都可以使用单例模式。对于一个实现了单例模式的类来说,它首先构造方法必须是私有的即private。

单例模式分为饿汉式和懒汉式;

饿汉式:

即这个唯一实例,在类进行加载的时候立刻进行实例化

package interview.pattern; 
public class SingLetonPattern{
    public static void main(String[] args){
    }
}
class Singleton(
    private static Singleton singtetorl = new singtetorl(); 
    private Singleton(){}
    public static Singleton getInstance(){
        return singtetorl;
    }
}

懒汉式:

在类加载的时候不进行实例化,在第一次使用的时候在进行实例化

package interview.pattern; 
public class SingLetonPattern{
    public static void main(String[] args){
    }
}
class Singleton(
    private static Singleton singtetorl
    private Singleton(){}
    
    // 加锁防止出现多次实例化
    public synchronized static Singleton getInstance(){
        if(singtetorl == null)
            singtetorl = new Singleton();
        return singtetorl;
    }
}

二、简单工厂模式

       简单工厂模式(Simple Factory Patterm):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod 使一个类的实例能延迟到其子类。

适用性:

1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当将创建对象的职责委托给多个帮助子类中的某一个,并且希望将那一个帮助子类是代理者这一信息局部化的时候。

  1. Product :定义工厂方法所创建的对象的接口。
public interface Work {
    void doWork();
}

2. ConcreteProduct :实现 Product 接口。

public class StudentWork implements Work {
    public void doWork() {
        System.out.println("学生*作业!");
    } 
}
public class TeacherWork implements Work {
    public void doWork() {
        System.out.println("老师审批作业!");
    } 
}

3. Creator  声明工厂方法,该方法返回一个 Product 类型的对象。 Creator 也可以定义一个工厂方法的缺省实现,它返回一个缺省的 ConcreteProduct 对象。  可以调用工厂方法以创建一个 Product 对象。

public interface IWorkFactory {
	Work getork();
}

4. ConcreteCreator  重定义工厂方法以返回一个 ConcreteProduct 实例。

pulic class StudentWorkFactory implements IWorkFactory {
	public Work getWork() {
    	return new StudentWork();
    } 
}
public class TeacherWorkFactory implements IWorkFactory {
	public Work getWork() {
    	return new TeacherWork();
    } 
}

Test

public class Test {
	public static void min(String[] args){
    	IWorkFactory studentWorkFactory = new StudentWorkFactory();
        studentWorkFactory.getWork().doWork();
		IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
        teacherWorkFactory.g*tWork().doWork();
    } 
}

result
学生做作业!
老师审批作业!

三、抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

适用性

1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们接口而不是实现时。

参与者

1.AbstractFactory
声明一个创建抽象产品对象的操作接口。
2.ConcreteFactory
实现创建具体产品对象的操作。
3.AbstractProduct
为一类产品对象声明一个接口。
4.ConcreteProduct
定义一个将被相应的具体工厂创建的产品对象。
实现 abstractProduct 接口。
5.Client
仅使用由 AbstractFactory 和 AbstractProduct 类声明的接口。