【Java】设计模式(Design Patterns)
    名词解释:在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。
    为什么要使用设计模式?根本原因还是软件开发要实现可维护、可扩展,就必须尽量复用代码,并且降低代码的耦合度。设计模式主要是基于OOP编程提炼的,它基于以下几个原则:
    开闭原则
    是指,软件应该对扩展开放,而对修改关闭。这里的意思是在增加新功能的时候,能不改代码就尽量不要改,如果只增加代码就完成了新功能,那是最好的。
    里氏替换原则
    是一种面向对象的设计原则,即如果我们调用一个父类的方法可以成功,那么替换成子类调用也应该完全可以运行。
    GoF把23个常用模式分为创建型模式、结构型模式和行为型模式三类。

    创建型模式
    创建型模式关注点是如何创建对象,其核心思想是要把对象的创建和使用相分离,这样使得两者能相对独立地变换。

    创建型模式包括:
    工厂方法:Factory Method
    设计模式(Design Patterns) - 图1
    工厂方法是指定义工厂接口和产品接口,但如何创建实际工厂和实际产品被推迟到子类实现,从而使调用方只和抽象工厂与抽象产品打交道。
    实际更常用的是更简单的静态工厂方法,它允许工厂内部对创建产品进行优化。
    调用方尽量持有接口或抽象类,避免持有具体类型的子类,以便工厂方法能随时切换不同的子类返回,却不影响调用方代码。

    | Java
    public class Person{
    private String name;

    public Person(String name){
    this.name = name;
    }
    }

    // 方式一(工厂接口):
    public interface PersonFactory {
    static PersonFactory personFactory = new PersonFactoryImpl();

    // 获取工厂实例:
    static PersonFactory getFactory() {
    return personFactory ;
    }

    1. // 获取Person实例方法<br /> Person getInstance(String name);<br />}

    public class PersonFactoryImpl implements PersonFactory{
    public Person getInstance(String name) {
    return new Person(name);
    }
    }
    // 客户端
    _public static void _main(String[] args) {
    PersonFactory factory = PersonFactory.getFactory();
    Person result = factory.getInstance(“小明”);
    }

    // 方式二(静态工厂方法)
    public class PersonFactory {
    public static Person getInstance(String name) {
    return new Person(name);
    }
    }
    // 客户端
    _public static void _main(String[] args) {
    Person result = PersonFactory.getInstance(“小明”);
    }
    | | —- |

    抽象工厂:Abstract Factory
    设计模式(Design Patterns) - 图2
    抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;
    抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。

    | Java
    public interface AbstractFactory {
    // 创建狗
    Dog dog(String md);
    // 创建猫
    Cat cat(String md);
    }

    // 狗接口:
    public interface Dog {
    String getName();
    void setName(String name);
    }

    // 猫接口:
    public interface Cat{
    void setAge(int age);
    }

    public class HouseDog implements Dog {
    private String name;

    public HouseDog(String name) {
    this.name = name;
    }
    }

    public class HouseCat implements Cat {
    private int age;

    public HouseCat(int age){
    this.age = age;
    }
    }

    public class HouseFactory implements AbstractFactory {
    public Dog createDog(String name) {
    return new HouseDog(name);
    }
    public Cat createCat(int age) {
    return new HouseCat(age);
    }
    }

    | | —- |

    建造者:Builder
    Builder模式是为了创建一个复杂的对象,需要多个步骤完成创建,或者需要多个零件组装的场景,且创建过程中可以灵活调用不同的步骤或组件。
    原型:Prototype
    原型模式是根据一个现有对象实例复制出一个新的实例,复制出的类型和属性与原实例相同。
    单例:Singleton
    Singleton模式是为了保证一个程序的运行期间,某个类有且只有一个全局唯一实例;
    Singleton模式既可以严格实现,也可以以约定的方式把普通类视作单例。