1.静态工厂模式(简单工厂模式)
1.1工厂类StaticFactory.java
/**
* @ClassName:StaticFactory
* @PackageName:com.figo.designpatterns.factory
* @Description:类描述
* @Date:2023/5/15 20:51
* @Author:figo
*/
public class StaticFactory {
public static final int TYPE_APPLE=1;
public static final int TYPE_BANANA=2;
public static final int TYPE_ORANGE=3;
/**
* 根据类型创建产品
* @param type
* @return
*/
public static Fruit getFruint(int type)
{
switch (type)
{
case TYPE_APPLE:
return new Apple();
case TYPE_BANANA:
return new Banana();
case TYPE_ORANGE:
return new Orange();
default:
break;
}
return null;
}
}
1.2 产品接口
package com.figo.designpatterns.model;
/**
* @ClassName:Fruit
* @PackageName:com.figo.designpatterns.model
* @Description:类描述
* @Date:2023/5/15 20:42
* @Author:figo
*/
public interface Fruit {
String name = null;
String colour = null;
/**
*
*/
void cleanAndEat();
}
1.3 产品模型类 Apple,Banana,Orange
package com.figo.designpatterns.model;
/**
* @ClassName:Apple
* @PackageName:com.figo.designpatterns.model
* @Description:类描述
* @Date:2023/5/15 20:42
* @Author:figo
*/
public class Apple implements Fruit{
@Override
public void cleanAndEat() {
System.out.println("clean and eat apple!");
}
}
package com.figo.designpatterns.model;
/**
* @ClassName:Banana
* @PackageName:com.figo.designpatterns.model
* @Description:类描述
* @Date:2023/5/15 20:45
* @Author:figo
*/
public class Banana implements Fruit{
@Override
public void cleanAndEat() {
System.out.println("clean and eat Banana!");
}
}
package com.figo.designpatterns.model;
/**
* @ClassName:Orange
* @PackageName:com.figo.designpatterns.model
* @Description:类描述
* @Date:2023/5/15 20:46
* @Author:figo
*/
public class Orange implements Fruit{
@Override
public void cleanAndEat() {
System.out.println("clean and eat Orange!");
}
}
1.4 静态工厂测试类
package com.figo.designpatterns;
import com.figo.designpatterns.factory.AppleFactory;
import com.figo.designpatterns.factory.StaticFactory;
import com.figo.designpatterns.model.Apple;
import com.figo.designpatterns.model.Fruit;
/**
* @ClassName:DesignPatternTest
* @PackageName:com.figo.designpatterns
* @Description:类描述
* @Date:2023/5/15 20:40
* @Author:figo
*/
public class DesignPatternTest {
public static void main(String[] args) {
/*
1.静态方法模式,该模式不够灵活,每次新增新的产品,需要修改StaticFactory工厂类
违背开闭原则的,对扩展开放,对修改关闭
*/
Fruit fruit1= StaticFactory.getFruint(StaticFactory.TYPE_APPLE);
fruit1.cleanAndEat();
}
}
2.工厂方法模式
2.1 工厂方法接口
package com.figo.designpatterns.factory;
import com.figo.designpatterns.model.Fruit;
/**
* @ClassName:FruitFactory 工厂方法接口
* @PackageName:com.figo.designpatterns.factory
* @Description:类描述
* @Date:2023/5/15 21:13
* @Author:figo
*/
public interface FruitFactory {
public Fruit getFruit();
}
2.2 各个产品具体的工厂
package com.figo.designpatterns.factory;
import com.figo.designpatterns.model.Apple;
import com.figo.designpatterns.model.Fruit;
/**
* @ClassName:AppleFactory 工厂方法模式,创建苹果
* @PackageName:com.figo.designpatterns.factory
* @Description:类描述
* @Date:2023/5/15 21:14
* @Author:figo
*/
public class AppleFactory implements FruitFactory{
@Override
public Fruit getFruit() {
return new Apple();
}
}
package com.figo.designpatterns.factory;
import com.figo.designpatterns.model.Banana;
import com.figo.designpatterns.model.Fruit;
/**
* @ClassName:BananaFactory 工厂方法模式,创建香蕉
* @PackageName:com.figo.designpatterns.factory
* @Description:类描述
* @Date:2023/5/15 21:15
* @Author:figo
*/
public class BananaFactory implements FruitFactory{
@Override
public Fruit getFruit() {
return new Banana();
}
}
package com.figo.designpatterns.factory;
import com.figo.designpatterns.model.Fruit;
import com.figo.designpatterns.model.Orange;
/**
* @ClassName:OrangeFactory 工厂方法模式,创建桔子
* @PackageName:com.figo.designpatterns.factory
* @Description:类描述
* @Date:2023/5/15 21:15
* @Author:figo
*/
public class OrangeFactory implements FruitFactory{
@Override
public Fruit getFruit() {
return new Orange();
}
}
2.3 工厂方法模式测试
package com.figo.designpatterns;
import com.figo.designpatterns.factory.AppleFactory;
import com.figo.designpatterns.factory.StaticFactory;
import com.figo.designpatterns.model.Apple;
import com.figo.designpatterns.model.Fruit;
/**
* @ClassName:DesignPatternTest
* @PackageName:com.figo.designpatterns
* @Description:类描述
* @Date:2023/5/15 20:40
* @Author:figo
*/
public class DesignPatternTest {
public static void main(String[] args) {
/**
* 2.工厂方法模式,符合开闭原则,对扩展开放,对修改关闭
* 每次需要新增一个产品,新增一个工厂即可
*/
Fruit fruit2= new AppleFactory().getFruit();
fruit2.cleanAndEat();
}
}