【Java】设计模式(Design Patterns)
名词解释:在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。
为什么要使用设计模式?根本原因还是软件开发要实现可维护、可扩展,就必须尽量复用代码,并且降低代码的耦合度。设计模式主要是基于OOP编程提炼的,它基于以下几个原则:
开闭原则
是指,软件应该对扩展开放,而对修改关闭。这里的意思是在增加新功能的时候,能不改代码就尽量不要改,如果只增加代码就完成了新功能,那是最好的。
里氏替换原则
是一种面向对象的设计原则,即如果我们调用一个父类的方法可以成功,那么替换成子类调用也应该完全可以运行。
GoF把23个常用模式分为创建型模式、结构型模式和行为型模式三类。
创建型模式
创建型模式关注点是如何创建对象,其核心思想是要把对象的创建和使用相分离,这样使得两者能相对独立地变换。
创建型模式包括:
工厂方法:Factory Method
工厂方法是指定义工厂接口和产品接口,但如何创建实际工厂和实际产品被推迟到子类实现,从而使调用方只和抽象工厂与抽象产品打交道。
实际更常用的是更简单的静态工厂方法,它允许工厂内部对创建产品进行优化。
调用方尽量持有接口或抽象类,避免持有具体类型的子类,以便工厂方法能随时切换不同的子类返回,却不影响调用方代码。
| 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 ;
}
// 获取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
抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;
抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。
| 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模式既可以严格实现,也可以以约定的方式把普通类视作单例。