设计模式分为三类公23种:
1. 创建型模式:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
4.行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
1.单列模式
/**
* 饿汉设计模式
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:16:11
* @version V1.0
*/
public class Student {
//私有化构造函数 让外界不能创建对象
private Student(){
}
private static Student instance = new Student();
public static Student getInstance(){
return instance;
}
}
/**
* 懒汉模式
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:20:43
* @version V1.0
*/
public class Person {
//私有化构造函数
private Person(){
}
private static Person person = null;
//为了解决安全问题加了同步
public synchronized static Person getInstance(){
if(person == null){
person = new Person();
}
return person;
}
}
2.简单工厂模式
public abstract class Animal {
public abstract void eat();
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
/**
* 简单工厂
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:44:15
* @version V1.0
*/
public class AnimalFactory {
public AnimalFactory(){
}
//创建对象
public static Animal createAnimal(String name){
if("dog".equals(name)){
return new Dog();
}else if("cat".equals(name)){
return new Cat();
}
return null;
}
}
/**
* 演示
* @author xinchunyu
* @CreateTime: 2019年9月23日 下午2:52:43
* @version V1.0
*/
public class AnimalDemo {
public static void main(String[] args) {
Dog dog = (Dog)AnimalFactory.createAnimal("dog");
dog.eat();
Cat cat = (Cat)AnimalFactory.createAnimal("cat");
cat.eat();
}
}
3.工厂方法模式
public abstract class Animal {
abstract void eat();
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
public interface AnimalFactory {
Animal createAnimal();
}
//工厂方法
public class CatFactory implements AnimalFactory{
@Override
public Animal createAnimal() {
return new Cat();
}
}
//工厂方法
public class DogFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
4.抽象工厂模式
//电脑接口
public interface Computer {
void sellMoney();
}
//手机接口
public interface Phone {
void sellNum();
}
//苹果的电脑实现类
public class AppleComputer implements Computer {
@Override
public void sellMoney() {
System.out.println("苹果电脑买10000元");
}
}
//苹果的手机实现类
public class ApplePhone implements Phone {
@Override
public void sellNum() {
System.out.println("苹果手机本月销量500万台");
}
}
//小米电脑接口实现类
public class XiaomiComputer implements Computer {
@Override
public void sellMoney() {
System.out.println("小米电脑卖4999");
}
}
//小米手机实现类
public class XiaomiPhone implements Phone {
@Override
public void sellNum() {
System.out.println("小米本月卖了1000万台");
}
}
//工厂接口
public interface Factory {
Phone createPhone();
Computer createComputer();
}
// apple电脑和手机的工厂实现类
public class AppleFactory implements Factory {
@Override
public Phone createPhone() {
return new ApplePhone();
}
@Override
public Computer createComputer() {
return new AppleComputer();
}
}
//小米工厂实现类
public class XiaomiFactory implements Factory {
@Override
public Phone createPhone() {
return new XiaomiPhone();
}
@Override
public Computer createComputer() {
return new XiaomiComputer();
}
}
//演示类
public class Demo {
public static void main(String[] args) {
XiaomiFactory xf = new XiaomiFactory();
XiaomiComputer xc = (XiaomiComputer) xf.createComputer();
XiaomiPhone xp = (XiaomiPhone) xf.createPhone();
xc.sellMoney();
xp.sellNum();
AppleFactory af = new AppleFactory();
AppleComputer ac = (AppleComputer) af.createComputer();
ApplePhone ap = (ApplePhone) af.createPhone();
ac.sellMoney();
ap.sellNum();
}
}
适配器模式
//方法接口
public interface UserDao {
void add();
void update();
void delete();
void query();
}
//适配器模式 通过实现空方法为了让UserDaoImpl 可以选择性的重写方法
public class UserAdapter implements UserDao {
@Override
public void add() {
}
@Override
public void update() {
}
@Override
public void delete() {
}
@Override
public void query() {
}
}
public class UserDaoImpl extends UserAdapter {
@Override
public void add() {
System.out.println("执行了增加操作");
}
}
//演示
public class UserDemo {
public static void main(String[] args) {
UserDaoImpl userDaoImpl = new UserDaoImpl();
userDaoImpl.add();
}
}
1.装饰者模式
装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活。
适用场景:动态的给一个对象添加或者撤销功能。
优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个功能按想要的顺序执行,以实现不同效果。
缺点:更多的类,使程序复杂
类型:结构型。
/**
* User 抽象组件
* UserImpl 具体实现
* Decorator 抽象装饰者
* SeeDecorator 具体装饰者
* DrinkDecorator 具体装饰者
*/
//最高层抽象类
public interface User {
void doEat();
}
//具体实现类
public class UserImpl implements User {
@Override
public void doEat() {
System.out.println("正在吃着饭");
}
}
//装饰抽象类
public abstract class Decorator implements User{
//很重要,组合抽象构件到自己的类中
private User user;
public Decorator(User user){
this.user = user;
}
@Override
public void doEat(){
this.user.doEat();
};
}
//装饰具体类
public class DrinkDecorator extends Decorator{
public DrinkDecorator(User user) {
super(user);
}
@Override
public void doEat() {
super.doEat();
System.out.println("还喝着水");
}
}
//装饰具体类
public class SeeDecorator extends Decorator {
public SeeDecorator(User user) {
super(user);
}
@Override
public void doEat() {
super.doEat();
System.out.println("还看着电视");
}
}
模板模式
定义:定义一个操作中的算法骨架,将一些步骤声明为抽象方法迫使子类去实现。不同的子类可以以不同的方式实现这些抽象方法
简单理解就是:将关键的业务方法、逻辑或算法封装起来,而把具体的一些容易变化的步骤留给之类来进行具体不同的设置,具体表现就是实现了父类的方法
/**
* MyTemplate 模板抽象类
* CustomerDaoImpl 模板子类
* StudentDaoImpl 模板子类
* Demo 演示类
*/
//模板抽象类
public abstract class MyTemplate {
//骨架不让子类重写
public final void execute(){
start();
//用钩子做判断
if(flag()){
run();
}
end();
}
//在模板方法中有一种函数叫做钩子函数,钩子函数的作用是让实现类可以通过一些方法来控制模板中的流程
public abstract boolean flag();
public abstract void run();
public void start(){
System.out.println("begin connection...");
}
public void end(){
System.out.println("end connection...");
}
}
//模板子类
public class CustomerDaoImpl extends MyTemplate {
@Override
public boolean flag() {
return true;
}
@Override
public void run() {
System.out.println("操作用户数据");
}
}
//模板子类
public class StudentDaoImpl extends MyTemplate {
@Override
public boolean flag() {
return false;
}
@Override
public void run() {
System.out.println("操作学生数据");
}
}
//演示类
public class Demo {
public static void main(String[] args) {
MyTemplate t1 = new CustomerDaoImpl();
t1.execute();
MyTemplate t2 = new StudentDaoImpl();
t2.execute();
}
}
//结果:
//begin connection...
//操作用户数据
//end connection...
//begin connection...
//end connection...
代理模式--静态代理
/*
* 静态代理
* BuyHouse 接口
* BuyHouseImpl 接口实现类
* BuyHouseProxy 代理类
* Demo 演示类
*/
//接口
public interface BuyHouse {
void doing();
}
//接口实现类
public class BuyHouseImpl implements BuyHouse {
@Override
public void doing() {
System.out.println("正在买房。。。");
}
}
//静态代理类
public class BuyHouseProxy implements BuyHouse {
private BuyHouse buyHouse;
public BuyHouseProxy(BuyHouse buyHouse){
this.buyHouse = buyHouse;
}
@Override
public void doing() {
System.out.println("开始买房");
this.buyHouse.doing();
System.out.println("买房结束");
}
}
//演示类
public class Demo {
public static void main(String[] args) {
BuyHouseProxy bp = new BuyHouseProxy(new BuyHouseImpl());
bp.doing();
}
}
//结果:
//开始买房
//正在买房。。。
//买房结束
代理模式--jdk动态代理
/**
* jdk利用反射动态代理
* BuyHouse 接口
* BuyHouseImpl 接口实现类
* DynamicInvocationHandler 代理实现类
* Demo 演示类
*/
//接口
public interface BuyHouse {
void doing();
}
//接口实现类
public class BuyHouseImpl implements BuyHouse {
@Override
public void doing() {
System.out.println("正在买房。。。");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//动态代理实现类
public class DynamicInvocationHandler implements InvocationHandler {
private BuyHouse buyHouse;
public DynamicInvocationHandler(BuyHouse buyHouse) {
this.buyHouse = buyHouse;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始买房");
Object invoke = method.invoke(buyHouse, args);
System.out.println("买房结束");
return invoke;
}
}
import java.lang.reflect.Proxy;
//演示
public class Demo {
public static void main(String[] args) {
BuyHouse buyHouse = new BuyHouseImpl();
DynamicInvocationHandler h = new DynamicInvocationHandler(buyHouse);
BuyHouse b = (BuyHouse)Proxy.newProxyInstance(buyHouse.getClass().getClassLoader(), buyHouse.getClass().getInterfaces(), h);
b.doing();
}
}
//结果:
//开始买房
//正在买房。。。
//买房结束