【知了堂学习笔记】——设计模式之工厂模式

工厂模式分为三类: 简单工厂模式 、 工厂方法模式、 抽象工厂模式

  • 工厂方法模式:
    • 一个抽象产品类,可以派生多个具体的产品类
    • 一个抽象工厂类,可以派生出多个具体的工厂类
    • 每一个具体工厂类只能创建一个具体产品类的实例
  • 抽象工厂模式:
    • 多个抽象产品类,可以派生多个具体的产品类
    • 一个抽象工厂类,可以派生出多个具体的工厂类
    • 每一个具体工厂类可以创建多个具体的产品类
  • 区别:
    1.工厂方法模式只有一个抽象的产品类,而抽象工厂模式有多个抽1象产品类。
    2.工厂方法模式具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

1.简单工厂模式

具有一个静态方法,用来接收参数,并根据参数来决定返回实现同一个接口的不同类的实现。

package factory;

/**
 * 定义简单工厂类
 * @author Administrator
 *
 */
public class SimpleFactory {
    public static void main(String[] args) {
        try {
            SimpleFactory.factory("erha");
            SimpleFactory.factory("jinmao");
            SimpleFactory.factory("samoye");
            SimpleFactory.factory("haha");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public static Product factory(String productName) throws Exception{
        if(productName.equals("erha")){
            return new Erha();
        }else if(productName.equals("jinmao")){
            return new Jinmao();
        }else if(productName.equals("samoye")){
            return new Samoye();
        }else{
            throw new Exception("没有该产品");
        }

    }
}

class Erha implements Product{
    public Erha(){
        System.out.println("二哈玩具被生产出来了");
    }
}

class Jinmao implements Product{
    public Jinmao(){
        System.out.println("金毛玩具被生产出来了");
    }
}

class Samoye implements Product{
    public Samoye(){
        System.out.println("萨摩耶玩具被生产出来了");
    }
}

简单工厂模式的核心就是一个SimpleFactory类,拥有必要的逻辑判断和产品的生产的方法,只需要交付订单,就能得到相应的产品。

缺点:
1.每次新增都需要修改SimpleFactory类的源码,当产品之间关系复杂的时候,相应的SimpleFactory类的逻辑判断也非常的复杂
2.整个系统都依赖SimpleFactory类,只要SimpleFactory类一出问题,就进入不能工作的状态

2.工厂方法

为工厂类定义了接口,用多态削弱了工厂类的职能

public interface Factory {
    public Product create();    
}

定义一个产品接口

public interface Product {}

实现了产品接口的产品类

class Erha implements Product{
    public Erha(){
        System.out.println("二哈玩具被生产出来了");
    }
}

class Jinmao implements Product{
    public Jinmao(){
        System.out.println("金毛玩具被生产出来了");
    }
}

class Samoye implements Product{
    public Samoye(){
        System.out.println("萨摩耶玩具被生产出来了");
    }
}

具体创建产品对象的具体工厂类

package factory;

//创建二哈的工厂
public class CreateErha implements Factory{
    public Product create() {
        return new Erha();
    }
}

//创建金毛的工厂
class CreateJinmao implements Factory{
    public Product create() {
        return new Jinmao();
    }

}

//创建萨摩耶的工厂
class CreateSamoye implements Factory{
    public Product create() {
        return new Samoye();
    }
}

工厂方法是把创建的产品放到实现了工厂接口的不同工厂类里面,不会因为一个工厂类出现问题而全部出现问题。

缺点:产品负责的等级结构的时候,就会形成复杂的产品树,不易维护。

3.抽象工厂(创建一系列互相关联和互相依赖的对象)
工厂方法是用来创建一个产品,没有分类的概念,而抽象工厂就是创建一系列产品,重点就在于产品的分类

可以二哈和金毛分别定义两个产品接口,以对他们进行分类

//二哈接口
public interface ErhaInterface {}

//金毛接口
public interface JinmaoInterface {}

分别创建这两个接口的具体产品

package factory;

public class ErhaA implements ErhaInterface{
    public ErhaA(){
        System.out.println("二哈-A被生产出来了");
    }
}

class ErhaB implements ErhaInterface{
    public ErhaB(){
        System.out.println("二哈-B被生产出来了");
    }
}

class JinmaoA implements JinmaoInterface{
    public JinmaoA(){
        System.out.println("金毛-A被生产出来了");
    }
}

class JinmaoB implements JinmaoInterface{
    public JinmaoB(){
        System.out.println("金毛-B被生产出来了");
    }
}

产品部分我们准备好了,接下来我们来处理工厂部分,我们先来定义工厂行为接口

package factory;

public interface AbstractFactory {
    public ErhaInterface creatErhaInterface();

    public JinmaoInterface creatJinmaoInterface();
}

接下来我创造具体的工厂类,我们根据上面产品的接口,把型号A的产品分为一类,由一个工厂来管理,把型号为B的产品有另一个工厂管理,根据这个分类,我们可以实现如下的两个具体工厂类

package factory;

//创建型号为A的工厂
public class EahaFactoryA implements ErhaInterface{
    //创建二哈-A
    public ErhaA createErhaA(){
        return new ErhaA();
    }
    public JinmaoA createJinmaoA(){
        return new JinmaoA();
    }
}
//创建型号为B的工厂
class EahaFactoryB implements ErhaInterface{
    //创建二哈-B
    public ErhaB createErhaB(){
        return new ErhaB();
    }
    public JinmaoB createJinmaoB(){
        return new JinmaoB();
    }
}

抽象工厂应用之前,会对创建对象进行系统的分类,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路。

请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
了课是一个在线教育平台,提供了丰富多样的课程内容。其中,flask web是其中一门非常受欢迎的课程。 Flask是一个基于Python语言开发的轻量级Web应用框架。它简洁易用,但功能强大,因此在Web开发中被广泛应用。Flask Web课程旨在教授学员如何使用Flask框架构建自己的Web应用程序。 在Flask Web课程中,学员将学习到如何搭建一个完整的Web应用程序。首先,课程会介绍Flask框架的基本概念和使用方法,学员将了解如何创建Flask应用和处理路由。接着,课程会涵盖数据库的使用,学员将学会如何与数据库进行交互,以存储和检索数据。 此外,Flask Web课程还会教授学员如何处理表单数据和用户认证。表单是Web应用中常见的用户输入形式,学员将学习如何处理表单数据,并对用户输入进行验证和处理。同时,课程还会介绍用户认证和授权的方法,以确保只有授权用户可以访问特定的页面或功能。 在课程的实践部分,学员将有机会建立自己的Web应用程序。通过完成一系列的编程任务和项目,学员将应用所学的识,并将其运用到实际项目中。 总之,了课的Flask Web课程是一门全面而实践性强的课程,旨在帮助学员掌握使用Flask框架构建Web应用程序的技能。无论是对于想要从事Web开发的人来说,还是对于已经有一定经验的开发者来说,这门课程都将带来很大的收益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值