首页 > 其他分享 >工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)

工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)

时间:2023-08-15 16:35:56浏览次数:42  
标签:void System 模式 IDEA println 工厂 public out


前言

简单工厂模式和工厂模式的区别 

简单工厂模式:也叫做静态工厂模式, 可创建多个实现类, 简单工厂模式实现了创建实现类的代码跟客户端分离, 在工厂类里面可以添加所需生成实现类的逻辑;
 缺点是每次增加一种实现类,都需要修改工厂类,不符合开闭原则;

上期我发了一篇简单工厂模式练习  简单工厂模式在农场系统中实现 没搞懂的小伙伴可以对比一下

 工厂模式:每个工厂类只创建一个实现类;
 如果要满足开闭原则的话, 考虑使用工厂模式,但是如果有多个实现类的话就需要创建多个工厂类, 会显得比较冗余;


一、什么是工厂模式?

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。

二、农场系统创建

1.各类概括

工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)_ide

产品角色

抽象类

Fruit

具体产品角色

普通类

Apple

具体产品角色

普通类

Grape

具体产品角色

普通类

Strawberry

抽象工厂角色

抽象类

FruitGardener

具体工厂角色

普通类

Apple Gardener

具体工厂角色

普通类

Grape Gardener

具体工厂角色

普通类

Strawberry Gardener

客户端

普通类

Client

 三、键入各类代码

 1.抽象产品 角色Fruit

工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)_System_02

package com.factorymethod.farm;

public interface Fruit {

    /*****生长*****/
    void grow();


    /*****收获*****/
    void harvest();


    /*****种植*****/
    void plant();
}

2.具体产品对象Apple 

工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)_ide_03

package com.factorymethod.farm;
//苹果 实现 水果接口
public class Apple implements Fruit {
    private int treeAge;   //private 私人的 被private修饰的只能被本类所访问

    public void grow(){
        System.out.println("Apple is growing...");
    }

    public void harvest(){
        System.out.println("Apple has been harvested...");
    }

    public void plant(){
        System.out.println("Apple has been planted...");
    }

    public int getTreeAge() {
        return treeAge;
    }

    public void setTreeAge(int treeAge) {
        this.treeAge = treeAge;
    }
}

3. 具体产品角色Grape(后面就不一一截图了)

package com.factorymethod.farm;
//葡萄 实现 水果接口
public class Grape implements Fruit{

    private boolean seedless;

    @Override
    public void grow() {
        System.out.println("Grape is growing...");
    }

    @Override
    public void harvest() {
        System.out.println("Grape has been harvested...");
    }

    @Override
    public void plant() {
        System.out.println("Grape has been planted...");
    }

    public boolean isSeedless() {
        return seedless;
    }

    public void setSeedless(boolean seedless) {
        this.seedless = seedless;
    }
}

4.具体产品角色Srawberry

package com.factorymethod.farm;
//草莓 实现 水果接口
public class Strawberry implements Fruit{

    @Override
    public void grow() {
        System.out.println("Strawberry is growing...");
    }

    @Override
    public void harvest() {
        System.out.println("Strawberry has been harvested...");
    }

    @Override
    public void plant() {
        System.out.println("Strawberry has been planted...");
    }


}

5.抽象工厂角色Fruit Gardener

package com.factorymethod.farm;

public interface FruitGardener {
    public Fruit factory();

}

6.具体工厂角色Apple Gardener

package com.factorymethod.farm;

public class AppleGardener implements FruitGardener{
    @Override
    public Fruit factory() {
        return new Apple();
    }
}

7.具体工厂角色Grape Gardener

package com.factorymethod.farm;

public class GrapeGardener implements FruitGardener{
    @Override
    public Fruit factory() {
        return new Grape();
    }
}

8.具体工厂角色Strawberry Gardener

package com.factorymethod.farm;

public class StrawberryGardener implements FruitGardener{
    @Override
    public Fruit factory() {
        return new Strawberry();
    }
}

9.客户端 Client

package com.factorymethod.farm;

import java.util.Scanner;

public class Client {
    public static void main(String[]args){
        Scanner scanner = new Scanner(System.in);
         while (true){
             String fruitname=null;
             System.out.println("请输入你要水果: ");
             Scanner in = new Scanner(System.in);
             String a = in.next();
             Fruit fruit = null;
             FruitGardener fruitGardener;
             if(a.equalsIgnoreCase("apple")){
                 fruitGardener=new AppleGardener();
                 fruit=fruitGardener.factory();
                 Apple apple =(Apple) fruit;
                 apple.setTreeAge(5);
                 System.out.println("苹果树的年龄为:"+apple.getTreeAge()+"年");
             }
             else if(a.equalsIgnoreCase("garpe")){
                 fruitGardener=new GrapeGardener();
                 fruit=fruitGardener.factory();
                 Grape grape=(Grape)fruit;
                 grape.setSeedless(true);
                 System.out.println(grape.isSeedless()==true?"葡萄无籽" : "葡萄有籽");
             }
             else if(a.equalsIgnoreCase("strawberry")){
                 fruitGardener=new StrawberryGardener();
                 fruit=fruitGardener.factory();
             }
             fruit.grow();
             fruit.harvest();
             fruit.plant();
             System.out.print("是否继续?(Y/N)");
             fruitname = scanner.next().substring(0);
             if (fruitname.equalsIgnoreCase("N")){
                 System.out.println("程序退出,再见!");
                 System.exit(0);
             }
         }
    }
}

 四、在主方法中运行一下

工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)_System_04

工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)_System_05

 成功!


标签:void,System,模式,IDEA,println,工厂,public,out
From: https://blog.51cto.com/u_16179624/7090055

相关文章

  • 设计模式-工厂模式
    工厂模式(文章目录)什么是工厂模式  工厂模式,顾名思义,就是将对象的创建看作一个工厂,你告诉工厂需要的实例类型,工厂给你对象实例。  一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。不过,在GoF的《设计模式》一书中,它将简单工厂模式看作是工厂......
  • C/C++基础知识点——设计原则及设计模式
    如何实现模块间高内聚、低耦合?封装与抽象;添加中间层;模块化;设计思想与原则单一职责;接口隔离原则;依赖倒置;迪米特原则;多用组合少用继承;设计模式:观察者模式设计原则及设计模式六大设计原则:单一职责原则;里氏替换原则;开闭原则;依赖倒置原则;接口隔离原则;最少知识原则。......
  • SAP CRM One Order 锁定模式用的是 Exclusive Lock
    在SAPCRMWebClientUI上点击Edit按钮后,界面进入可编辑状态:后台SM12事务码观察到锁类型为E,即Exclusivelock,也就是排他锁。其中PRCD_HEAD是Pricing模块抬头级别的数据:CRMOneOrder对应的lockobject名称为:E_CRM_ORDER关于这个叫做prospect的必填字......
  • 【设计模式之禅】单一职责
    最近前辈推荐我读《设计模式之禅》这本书,原因是我写的代码质量实在是一言难尽,开发速度很快,但是bug数就很多了,设计原则这种知识就需要掌握写这篇文主要是记录自己的学习以及督促自己第一章【单一职责】从我理解的层面来谈谈单一原则:明确每个类每个方法的任务,只做一......
  • 设计模式的六大原则
    开放封闭原则(OpenClosePrinciple)对外扩展是开放的,对内修改是封闭的,目的是保证程序的可扩展性以及可维护性 里氏代换原则(LiskovSubstitutionPrinciple)子类可以扩展父类的功能,但不能改变父类原有的功能。规定了子类不得重写父类的普通方法,只能重写父类的抽象方法,如果在设......
  • 设计模式--策略模式
    简介策略模式是一种行为设计模式,它将一组行为转换为对象,并使其在原始上下文对象内部能够相互替换原始对象被称为上下文,它包含指向策略对象的引用并将执行行为的任务分派给策略对象组成策略接口(Strategy):所有具体策略的通用接口,它声明了一个上下文用于执行策略的方法具体......
  • 设计模式大全:覆盖各类场景的实用模式与结构图
    设计模式大全:覆盖各类场景的实用模式与结构图目录设计模式大全:覆盖各类场景的实用模式与结构图1、设计模式六大原则(SOLID)2、设计模式分类及适用场景3、GOF经典设计模式及其结构图3-1、创建型1)工厂模式-FactoryPattern2)抽象工厂模式-AbstractFactoryPattern3)单例模式-Singleton......
  • 突破瓶颈:能源服务商的EMC模式
     ##01.什么是合同能源管理?合同能源管理(EMC-EnergyManagementContract) 是一种新型的市场化节能机制,其实质就是以减少的能源费用来支付节能项目全部成本的节能投资方式。:节能服务公司与用能单位以契约形式约定节能项目的节能目标,节能服务公司为实现节能目标向用能单位提......
  • 如何用Spring 原生注解 快速实现策略模式+工厂模式
    前言这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来,单独做一个微服务,实现企业交互逻辑的关注点分离。在这里面我很自然而然的就用到了策略模式+工厂模式的方式,包装内部实现细节,向外提供统一的调用方式,有效的减少if/else的业务代码,使......
  • 13 桥接模式 -- go语言设计模式
    桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(HandleandBody)模式或接口(interface)模式。桥接模式的实现代码packagemainimport"fmt"//发送信息的具体实现(操作)typeMessageImplementerinterface{ send(test,......