具有代表性的设计模式:
我们在使用设计模式时:切记先有业务场景,才有设计模式
设计模式有六大原则:
单一职责原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
开闭原则
设计模式的关系
注意:源码中的 设计模式通常不是单一使用的
设计模式在我的理解是前人栽树 后人乘凉
总结前人经验 提供设计模式给后人使用
设计模式提高代码可读性,可扩展性
工厂模式有三种形态:
简单工厂
简单工厂又叫做静态工厂,但不属于23中设计模式
他的实质是由一个工厂类传入的参数,动态的决定该创建哪一种产品
Spring的beanFactory就是简单工厂模式的体现
下面是一个例子:
public class SampleFactory {
public Milk getMilk(String name){
switch (name) {
case "特仑苏":return new TeLunSu();
case "蒙牛":return new MengNiu();
case "伊利":return new Yili();
default:return null;
}
}
}
工厂方法模式
一般情况,应用程序有自己的工厂对象来创建Bean,同时将工厂交给Spring管理
下面是一个例子:
牛奶厂接口
public interface Factory {
Milk getMilk();
}
蒙牛厂类
public class MengLiuFactory implements Factory {
@Override
public Milk getMilk() {
return new MengNiu();
}
}
特仑苏厂类
public class TeLunSuFactory implements Factory {
@Override
public Milk getMilk() {
return new TeLunSu();
}
}
伊利厂类
public class YiLiFactory implements Factory {
@Override
public Milk getMilk() {
return new Yili();
}
}
public class FactoryTest {
public static void main(String[] args) {
Factory factory = new MengLiuFactory();
Milk milk = factory.getMilk();
}
}
这样,用户使用的时候 ,只需要拿到某种工厂类,就使用了,不用考虑使用成产过程,只拿结果就可以了
抽象工厂模式
工厂的抽象类
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
注意事项:产品族难扩展,产品等级易扩展。
/**
* 描述:
* 抽象工厂 用户的主入口
* 在spring中用的最广泛
*/
public abstract class AbstractFactory {
/**
* @return
* Spring中增加功能,但是他的用户无感知
*/
public abstract Milk getMengNiu();
public abstract Milk getYiLi();
public abstract Milk getTeLunSu();
}
MilkFactory 的实现类
public class MilkFactory extends AbstractFactory {
@Override
public Milk getMengNiu() {
return new MengLiuFactory().getMilk();
}
@Override
public Milk getYiLi() {
return new YiLiFactory().getMilk();
}
@Override
public Milk getTeLunSu() {
return new TeLunSuFactory().getMilk();
}
}
/**
* 描述:
* 抽象工厂 用户的主入口
*
* @author Yangjy
* @version 1.0.0
* @create 2018-03-15 10:03
*/
public abstract class AbstractFactoryTest {
public static void main(String[] args) {
MilkFactory milkFactory = new MilkFactory();
//用户有了选择的权利,保证了代码的健壮性
Milk mengNiu = milkFactory.getMengNiu();
}
}
这种模式就是Spring中用的非常的模式