工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)
  TEZNKK3IfmPf 2024年04月26日 38 0

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

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

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

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


一、什么是工厂模式?

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

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

二、农场系统创建

1.各类概括

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

 

产品角色

抽象类

Fruit

具体产品角色

普通类

Apple

具体产品角色

普通类

Grape

具体产品角色

普通类

Strawberry

抽象工厂角色

抽象类

FruitGardener

具体工厂角色

普通类

Apple Gardener

具体工厂角色

普通类

Grape Gardener

具体工厂角色

普通类

Strawberry Gardener

客户端

普通类

Client

 三、键入各类代码

 1.抽象产品 角色Fruit

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

package com.factorymethod.farm;

public interface Fruit {

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


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


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

2.具体产品对象Apple 

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

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)

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

 成功!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年04月26日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年03月29日   127   0   0 IDEAgt
TEZNKK3IfmPf