zoukankan      html  css  js  c++  java
  • 【设计模式学习笔记】 之 工厂方法模式

    简介:

    一个类编写过程中,需要一个不能确定的对象,去执行一些操作,这个时候,我们需要使用一个抽象的方法或者已实现的方法来返回需要的对象,这个对象的实现,可以根据继承让子类覆盖重写,从而起到一个占位的作用,以及使对象更佳灵活。

    举例:

    类似前一篇博客的例子,同样以4s店为例,这次的4s店是厂家直营店,意思是这个直营店只经营一种品牌,这里没有定义工厂,那么每个品牌4s店有一个get方法可以返回一个汽车的对象,但是此时我们不确定返回汽车的具体类型,我们只知道它是辆汽车,我们需要这辆汽车去做试车(haveATry()方法),所以我们定义这个方法为抽象方法,让其子类去实现这个方法,同时这个类也变成了抽象类

    创建一个Car接口,并实现两辆汽车BenzCar和VolvoCar

     1 package com.mi.factorymethod;
     2 
     3 /**
     4  * 汽车接口
     5  * @author hellxz
     6  */
     7 public interface Car {
     8 
     9     //接口中的方法与变量均为public static final修饰的
    10     void run();
    11 }
     1 package com.mi.factorymethod;
     2 
     3 /**
     4  * 奔驰汽车
     5  * @author hellxz
     6  */
     7 public class BenzCar implements Car{
     8 
     9     @Override
    10     public void run() {
    11         System.out.println("开着奔驰去兜风");
    12     }
    13 
    14 }
     1 package com.mi.factorymethod;
     2 
     3 /**
     4  * 沃尔沃汽车
     5  * @author hellxz
     6  */
     7 public class VolvoCar implements Car{
     8 
     9     @Override
    10     public void run() {
    11         System.out.println("沉稳大气的沃尔沃");
    12     }
    13     
    14 }

    接下来定义直营店的抽象类,正如开始所说的那样

     1 package com.mi.factorymethod;
     2 
     3 /**
     4  * 工厂方法设计模式:一个类编写过程中,需要一个不能确定的对象,去执行一些操作,这个时候,
     5  * 我们需要使用一个抽象的方法或者已实现的方法来返回需要的对象,这个对象的实现,可以根据
     6  * 继承让子类覆盖重写,从而起到一个占位的作用,以及使对象更佳灵活
     7  * @author hellxz
     8  * 
     9  * 直售4s店抽象类
    10  */
    11 public abstract class StraightSale4S {
    12 
    13     public void haveATry() {
    14         //此处我们需要一个汽车对象,但是我们不确定需要什么样的汽车
    15         getCar().run();
    16     }
    17     
    18     //定义一个返回Car对象的方法,可以默认实现,也可以抽象方法让子类必须实现
    19     public abstract Car getCar();
    20     
    21 }

    创建继承StraightSale4S的实现类,在BenzCarSSSS和VolvoCarSSSS分别重写getCar方法返回不同的实例

     1 package com.mi.factorymethod;
     2 
     3 /**
     4  * 奔驰4s直营店
     5  * @author hellxz
     6  */
     7 public class BenzCarSSSS extends StraightSale4S {
     8 
     9     @Override
    10     public Car getCar() {
    11         //创建一个BenzCar实例
    12         return new BenzCar();
    13     }
    14 
    15 }
     1 package com.mi.factorymethod;
     2 
     3 /**
     4  * 沃尔沃4s直营店
     5  * @author hellxz
     6  */
     7 public class VolvoCarSSSS extends StraightSale4S {
     8 
     9     @Override
    10     public Car getCar() {
    11         //创建一个VolvoCar实例
    12         return new VolvoCar();
    13     }
    14 
    15 }

    写个测试类:

     1 package com.mi.factorymethod;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) {
     6 //        StraightSale4S ssss = new BenzCarSSSS();
     7         /*
     8          * 仅需要切换4s直营店的名称就能获得不同品牌的汽车对象
     9          */
    10         StraightSale4S ssss = new VolvoCarSSSS();
    11         ssss.haveATry();
    12     }
    13 
    14 }

    输出:

    沉稳大气的沃尔沃

    注掉第10行,开启第6行

    开着奔驰去兜风

    总结:

    工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。

    优点:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可

    缺点:和优点一样,为了生产更多不同的产品需要创建更多的实现类和产品类,即一个具体工厂只能创建一种具体产品。

    应用场景:

    • 当一个类不知道它所需要的对象的类时
    • 当一个类希望通过其子类来指定创建对象时 
  • 相关阅读:
    vscode的一些常用、神奇操作
    vue2.x中使用v-model进行父传子
    js设置,获取,删除cookies
    Linux虚拟机克隆后网卡UUID问题
    jQuery ajax 请求HttpServlet返回[HTTP/1.1 405 Method not allowed]
    byte、二进制、十进制数值之间的转换
    sqlite-jdbc jar包下载过程笔记
    windows系统bat方式启动tomcat出现java.lang.OutOfmemoryError:PermGen Space 错误
    DIV内容垂直居中
    在HTML中实现和使用遮罩层
  • 原文地址:https://www.cnblogs.com/hellxz/p/8449770.html
Copyright © 2011-2022 走看看