前言
简单工厂模式和工厂模式的区别
简单工厂模式:也叫做静态工厂模式, 可创建多个实现类, 简单工厂模式实现了创建实现类的代码跟客户端分离, 在工厂类里面可以添加所需生成实现类的逻辑;
缺点是每次增加一种实现类,都需要修改工厂类,不符合开闭原则;
上期我发了一篇简单工厂模式练习 简单工厂模式在农场系统中实现 没搞懂的小伙伴可以对比一下
工厂模式:每个工厂类只创建一个实现类;
如果要满足开闭原则的话, 考虑使用工厂模式,但是如果有多个实现类的话就需要创建多个工厂类, 会显得比较冗余;
一、什么是工厂模式?
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。
二、农场系统创建
1.各类概括
产品角色 |
抽象类 |
Fruit |
具体产品角色 |
普通类 |
Apple |
具体产品角色 |
普通类 |
Grape |
具体产品角色 |
普通类 |
Strawberry |
抽象工厂角色 |
抽象类 |
FruitGardener |
具体工厂角色 |
普通类 |
Apple Gardener |
具体工厂角色 |
普通类 |
Grape Gardener |
具体工厂角色 |
普通类 |
Strawberry Gardener |
客户端 |
普通类 |
Client |
三、键入各类代码
1.抽象产品 角色Fruit
package com.factorymethod.farm;
public interface Fruit {
/*****生长*****/
void grow();
/*****收获*****/
void harvest();
/*****种植*****/
void plant();
}
2.具体产品对象Apple
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);
}
}
}
}
四、在主方法中运行一下
成功!