我们在实际写代码过程中往往不会过度强调在用哪种设计模式。
但了解学习优秀的设计模式能够便于我们写出更为优质的代码。
采用设计模式编写代码可以具备易用、拓展、清晰等多种特质。
既便如此,在实际编写过程中,不能被设计模式所束缚,因地制宜才是最好的。
本文主要讲述的是,创建者模式中的工厂模式。
创建者模式:为了用更加优雅的方式创建对象。
工厂模式:字如其意,用于创建对象的中心,主要为了生产出需要的对象。
该模式使用的频次较少,简单来说就是你需要什么,我创建什么。
该设计模式主要为了将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。
简单工厂方法是静态方法,可通过工厂类类名直接调用,只需要传入一个简单的参数即可,无须知道对象的创建细节。
可以将参数保存在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();
优点:
缺点:
场景:
实际编写代码并不会局限于使用某一种设计模式。
代码在不断优化升级重构过程中会出现模式的迁移情况。
无论采用何种设计模式,编码时我们要考虑这些特质:
当前还没有观点发布,欢迎您留下足迹!
在web.xml中经常会看到listener,filter,servlet的相关标签配置,它们分别是监听器、过滤器、容器,都是在项目启动的时候就可以进行初始化的加载动作
JAVA中通过继承Thread类、实现Runnable接口以及实现Callable接口配合Future接口实现创建多线程,三种方式各有优缺点,而第三种则具备更多的增强能力
SpringBoot 可以通过 spring.profiles.active 属性指定生效不同配置文件来满足多环境要求,多环境更为复杂的场景,就需要理解配置文件生效优先级,考虑直接引入外部配置项和配置文件
在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理
scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;动态获取的信息以及动态调用对象的方法的功能。