1、什么是设计模式
设计模式是一套【经过实践验证】的针对【特定问题】的解决方案,例如如果想让某一个类只被创建一次,并且被其它所有的类公用,则【单例模式】会是很好的解决方案。一般来讲,设计模式具有以下特征:
- 与具体编程语言无关
- 是经过大量工程实践的经验总结
- 可以用来进行系统架构设计
- 恰当使用能够让应用程序更加灵活、可维护性高、代码可重用性高
3、设计模式分类
- 创建型设计模式
工厂模式
抽象工厂模式
单例模式
原型模式
建造者模式 - 结构型设计模式
适配器模式
桥接模式
组合模式
装饰模式
外观模式
享元模式
代理模式 - 行为型设计模式
职责链模式
命令模式
解释器模式
迭代器模式
中介者模式
备忘录模式
观察者模式
状态模式
模板方法模式
访问者模式
4、设计模式实践
(1) 创建型模式——工厂模式
public class FactoryMethod {
public static void main(String[] args) throws IOException {
String animalType = null;
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
animalType = bufferReader.readLine();
Animal animal = AnimalFactory.getAnimal(animalType);
if(animal != null){
animal.yell();
}
}
}
abstract class Animal {
protected int age; // 设置成protected,让子类可以访问
public abstract void yell();
}
class Dog extends Animal {
@Override
public void yell() {
System.out.println("Dog yell");
}
}
class Cat extends Animal {
@Override
public void yell() {
System.out.println("Cat yell");
}
}
class AnimalFactory {
public static Animal getAnimal(String type){
if(type.equalsIgnoreCase("Dog")){
return new Dog();
}
if(type.equalsIgnoreCase("Cat")){
return new Cat();
}
return null;
}
}
(2)创建型模式——抽象工厂模式
public class AbstractFactory {
public static void main(String[] args) throws IOException {
String factoryType = null;
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
factoryType = bufferReader.readLine();
AbstractAnimalFactory animalFactory = AnimalFactoryCreater.getFactory(factoryType);
if(animalFactory != null){
Animal animal = animalFactory.getAnimal();
animal.yell();
}
}
}
class AnimalFactoryCreater{
public static AbstractAnimalFactory getFactory(String choice){
if(choice.equalsIgnoreCase("Dog")){
return new DogFactory();
}
if(choice.equalsIgnoreCase("Cat")){
return new CatFactory();
}
return null;
}
}
abstract class AbstractAnimalFactory {
public abstract Animal getAnimal();
}
class DogFactory extends AbstractAnimalFactory {
@Override
public Animal getAnimal() {
return new Dog();
}
}
class CatFactory extends AbstractAnimalFactory {
@Override
public Animal getAnimal() {
return new Cat();
}
}
abstract class Animal {
protected int age; // 设置成protected,让子类可以访问
public abstract void yell();
}
class Dog extends Animal {
@Override
public void yell() {
System.out.println("Dog yell");
}
}
class Cat extends Animal {
@Override
public void yell() {
System.out.println("Cat yell");
}
}
5、总结