我们在实际写代码过程中往往不会过度强调在用哪种设计模式。
但了解学习优秀的设计模式能够便于我们写出更为优质的代码。
采用设计模式编写代码可以具备易用、拓展、清晰等多种特质。
既便如此,在实际编写过程中,不能被设计模式所束缚,因地制宜才是最好的。
本文主要讲述的是,创建者模式中的工厂模式。
创建者模式:为了用更加优雅的方式创建对象。
工厂模式:字如其意,用于创建对象的中心,主要为了生产出需要的对象。
该模式使用的频次较少,简单来说就是你需要什么,我创建什么。
该设计模式主要为了将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。
简单工厂方法是静态方法,可通过工厂类类名直接调用,只需要传入一个简单的参数即可,无须知道对象的创建细节。
可以将参数保存在XML等格式的配置文件中,修改时无须修改任何Java源代码。
但是,工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则。
//产品接口
interface Person{
void create();
}
//产品实现类
public class Man implements Person {
@Override
public String create() {
return "Create Man";
}
}
public class Woman implements Person {
@Override
public String create() {
return "Create Woman";
}
}
//工厂类
public class PersonFactory {
public static Person create(String what)
{
Person person = null;
switch (what)
{
case "M" :
person = new Man();
break;
case "W" :
person = new Woman();
break;
}
return person;
}
}
//最终调用
Person man = PersonFactory.create("M");
Person woman = PersonFactory.create("W");
优点:
缺点:
场景:
工厂方法模式(Factory Method Pattern)简称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式。
工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
工厂方法模式是简单工厂模式的进一步抽象和推广,保持了简单工厂模式的优点,并克服了它的缺点。
核心工厂类不再负责所有产品的创建,而是将具体创建工作交给其子类去完成,允许系统在不修改工厂角色的情况下引进新产品。
实际过程为:增加具体产品-->增加具体工厂,符合开闭原则。
//产品接口
interface Person{
void create();
}
//产品实现类
public class Man implements Person {
@Override
public String create() {
return "Create Man";
}
}
//以上与简单工厂一致
//工厂方法父类(接口类)
interface PersonFactory {
Person createPerson();
}
//工厂方法子类(实现类)
public class ManFactory implements PersonFactory {
@Override
public Person createPerson() {
return new Man();
}
}
//实际调用
PersonFactory manFactory = new ManFactory();
Person man = manFactory.createPerson();
优点:
缺点:
场景:
抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类,抽象工厂模式又称为Kit模式。
抽象工厂模式中存在着产品族和产品等级两大概念。
产品族:同一个工厂生产的,位于不同产品等级结构中的一组产品,如下方代码的女人、女孩
产品等级:产品等级结构即产品的继承结构,如下方代码的女性->女人,女性->女孩
//产品族 男性
public interface Male {
}
//男性产品等级下男人
public class Man implements Male {
}
//男性产品等级下男孩
public class Boy implements Male {
}
//同理女性产品族
public interface Female {
}
public class Woman implements Female {
}
public class Girl implements Female {
}
//抽象工厂
interface PersonFactory {
public Male createMale();
public Female createFemale();
}
//实现工厂 成年生产工厂
public class AdultFactory implements PersonFactory {
@Override
public Male createMale() {
return new Man();
}
@Override
public Female createFemale() {
return new Woman();
}
}
//实现工厂 幼年生产工厂
public class ChildFactroy implements PersonFactory {
@Override
public Male createMale() {
return new Boy();
}
@Override
public Female createFemale() {
return new Girl();
}
}
//最终调用
PersonFactory adultFactory = new AdultFactory();
Male man = adultFactory.createMale();
Female woman = adultFactory.createFemale();
PersonFactory childFactory = new ChildFactroy();
Male boy = childFactory.createMale();
Female girl = childFactory.createFemale();
优点:
缺点:
场景:
实际编写代码并不会局限于使用某一种设计模式。
代码在不断优化升级重构过程中会出现模式的迁移情况。
无论采用何种设计模式,编码时我们要考虑这些特质:
当前还没有观点发布,欢迎您留下足迹!
Spring就像一个大家族,里面包含了很多衍生产品,其中最为出名的就是SpringMVC和SpringBoot,那么这三者之间是什么关系呢?SpringMVC和SpringBoot又专门用来做什么呢?
在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理
SpringMVC框架是围绕DispatcherServlet(前端控制器)展开的,本文描述SpringMVC的优点、各个核心类(角色)作用,并说明用户请求数据到最终视图返回完整的数据传输过程
SpringBoot 的 MyBatis 默认采用 hikari 连接池,druid (德鲁伊) 连接池由阿里开源,它不仅仅是一个连接池,更是代理、过滤器、解析器、插件、监控、优化等实用功能组件库,更在阿里生产环境得到验证,所以 Lets Do It
Struts2框架以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架,本文主要是与Spring整合关键配置和实例
scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。