概述:
设计模式(Design Patterns):是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的就是为了代码可重用性、让代码更容易的被他人理解、保证代码可靠性。设计模式有助于帮助我们对框架结构的理解和掌握。
设计模式在设计和开发的过程中遵循的原则:
- 单一职责原则(Single Responsibility Principle,SRP)
- 开闭原则(Open Closed Principle,OCP)
- 里氏代换原则(Liskov Substitution Principle,LSP)
- 依赖倒转原则(Dependency Inversion Principle,DIP)
- 接口隔离原则(Interface Segregation Principle,ISP)
- 合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
- 最小知道原则/迪米特法则(Principle of Least Knowledge,PLK)
详情可查看我的另一篇博客:设计模式中需要遵循的设计原则
java编程中设计模式总体来说大致分为三大类,23种:
- 创建型模式(五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
- 结构型模式(七种):适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
- 行为型模式(十一种):模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
如下图各种设计模式之间的关系:
工厂方法模式(Factory Method )
假设一个场景:
我们都知道,现在比较主流的android 手机使用Type-C接口进行充电或数据连接,而苹果手机使用的是Lightning接口。
如果我们要为手机充电,就需要我们既知道使用的是什么接口的手机也要知道选择什么接口的充电线才可以。
对于我们来说我们只需要充数据线和手机就可以充电了,关键是怎么选择充电线和手机。
假设苹果商店只卖苹果手机,android 商店只卖安卓手机,A工厂只生产Type-C数据线,B工厂只生产Lightning数据线。
如果是你的话,你会怎么设计程序去选择手机和充电线?
工厂方法模式分为三种:
- 普通工厂模式
手机接口与具体实现
public interface Store{
public void getPhone();
}
public class IphoneStore implements Store{
public IphoneStore(){}
public void getPhone(){
System.out.println("获取Iphone 手机")
}
}
public class AndroidStore implements Store{
public IphoneStore(){}
public void getPhone(){
System.out.println("获取Android 手机")
}
}
数据线接口及具体实现
public interface DataLine{
public void charge();
}
public class TypecDataLine implements DataLine{
public void charge(){
System.out.println("我是Type-C数据线,可以给android手机充电");
}
}
public class LightningDataLine implements DataLine{
public void charge(){
System.out.println("我是Lightning数据线,可以给Iphone充电");
}
}
手机与数据线工厂类
public class PhoneFactory{
public static Store createPhone(String type){
Store store=null;
if("iphone".equash(type)){
store=new IphoneStore();
}else if("android".equash(type)){
store=new AndroidStore();
}
return store;
}
}
public class DataLineFactory{
public static Store createDataLine(String type){
DataLine dataLine=null;
if("typec".equash(type)){
dataLine=new TypecDataLine();
}else if("lightning".equash(type)){
dataLine=new LightningDataLine();
}
return dataLine;
}
}
测试客户端
public class ChargingClient {
public static void main(String[] args) {
String phoneType="iphone";
String datalineType="lightning";
DataLine dataline= DataLineFactory.getDataLine(datalineType);
Store phone=PhoneFactory.getStore(phoneType);
phone.getPhone();
dataline.charge();
}
}
输出: