设计模式——第一章工厂模式

    科技2023-11-01  98

    设计模式

    一、7大设计原则

    1.1 单一职责原则

    ​ 一个对象应该只包含单一的职责,并且该职责被完整的封装到一个类中

    1.2 开闭原则

    ​ 软件实体应该对扩展开放,对修改关闭

    1.3里氏替换原则

    ​ 所有引用基类的地方必须能透明的使用其子类对象

    1.4依赖倒转原则

    ​ 高层模块不应该依赖底层模块,他们都应该依赖抽象,抽象不应该依赖细节,细节应该依赖于抽象

    1.5 接口隔离原则

    ​ 客户端不应该依赖他那些不需要的接口

    1.6 合成复用原则

    优先使用对象组合,而不是通过继承达到复用的目的

    1.7 迪米特法则

    每一个软件单位对其他单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位

    二、工厂模式

    2.1 简单工厂 模式

    2.1.1简单工厂模式实现

    抽象产品: 将要批量生产的对象实体进行一个抽象提取,便于扩展更多实体

    public abstract class Product{ //所有产品类的公共业务方法 public void methodSame(){ //公共方法的实现 } //声明抽象业务方法 public abstract void methodDiff(); }

    具体产品:继承抽象产品,将产品实例化:比如(披萨是抽象产品,实例化产品可以是各种口味的披萨,胡椒味,麻辣味等等)

    public class ConcreteProduct extdents Product{ //实现业务方法 public void methodDiff(){ //业务方法的实现 } }

    工厂类:简单工厂的核心,根据用户传入不同参数来创建不同类型的产品对象。比如(传入胡椒味,创建胡椒味具体的实例对象),若要添加新的产品生产,只用添加一个实体类,在工厂类的静态工厂方法中添加一个else if 即可。

    public class Factory{ //静态工厂方法 public static Product getProduct(String arg){ Product product = null; if(arg.equalsIgnoreCase("A")){ product =new ConcreteProductA(); //初识化设置product }else if(arg.equalsIgnoreCase("B")){ product =new ConcreteProductB(); //初始化设置product } return product; } }

    具体客户端使用:传入不同参数,创建不同实体类

    public class Client{ public static void main(String args[]){ Product product; product =Factory.getProduct("A");//通过工厂创建产品对象 product.methodSame(); product.methodDiff(); } }

    2.1.2 简单工厂模式优缺点

    ​ 优点:简单工厂实现了对象创建和使用的分离,客户端无需知道创建的具体类名,只需知道要传的参数即可得到对象。实现了解耦

    ​ 缺点:使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,扩展困难,一旦实体类多了,要扩张就会修改工厂的逻辑,不利于维护。适用于那种创建对象较少,业务逻辑简单的情况。

    2.2 工厂方法模式

    2.2.1工厂方法模式结构

    (1)Product(抽象产品):它是定义产品的一个接口,是工厂方法模式所创建对象的超类型,公共父类

    (2)ConcreteProduct(具体产品):对抽象产品的一个具体实现。

    (3)Factory(抽象工厂):声明了一个工厂方法,用于返回一个抽象产品。(核心)

    (4)ConcreteFactory(具体工厂) : 是抽象工厂的子类,返回一个具体产品

    2.2.1 工厂方法模式实现

    (1)抽象工厂 :对具体工厂进行的一个统一抽象,便于后面的扩展

    public interface Factory{ public Product factoryMethod(); }

    (2)具体工厂:返回工厂的具体产品

    public class ConcreteFactory implements Factory{ public Product factryMethod(){ return new ConcreteProduct(); } }

    2.2.2 工厂方法模式优缺点

    (1)优点 :系统中加入新产品时,只要添加一个具体的工厂和具体产品即可,系统的扩展性提高了,符合开闭原则

    (2)缺点: 当产品类增加的时候,要添加的具体工厂类也要随着增加,增加了系统的复杂度,给系统也带来了额外的开销。多了一个抽象工厂,增加了系统的抽象性和理解难度。

    2.3抽象工厂模式

    2.3.1抽象工厂模式结构图

    2.3.2 抽象工厂模式实现

    抽象工厂类

    public interface AbstractFactory{ public AbstractProductA creatProductA();//工厂方法一 public AbstractProductB creatProductB();//工厂方法二 }

    具体工厂类

    public class ConcreteFactory1 implements AbstractFactory{ //工厂方法一 public AbstractProductA creatProductA(){ return new ConcreteProductA1(); } //工厂方法二 public AbstractProductB creatProductB(){ return new ConcreteProductB1(); } }

    2.3.3 抽象工厂模式优缺点

    优点:隔离了具体类的生成,使得客户端并不需要知道什么被创建;当一个产品族中的多个对象被设计成一起工作时,它能保证客户端只使用同一个产品族中的对象;增加新产品族很方便,无需修改已有系统,符合开闭原则。

    缺点:主要是增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,违背了开闭原则。

    Processed: 0.021, SQL: 8