Java设计模式之工厂模式案例详解

网友投稿 267 2022-08-28


Java设计模式之工厂模式案例详解

目录分类案例需求方案一:简单工厂模式方案二:工厂方法模式方案三:抽象工厂模式对比分析总结

分类

1.简单工厂模式

2.工厂方法模式

3.抽象工厂模式

案例

需求

根据蛋糕的不同口味,分别创建苹果味和香蕉味的蛋糕实例

方案一:简单工厂模式

定义蛋糕父类

/**

* 蛋糕

* @author:liyajie

* @createTime:2022/2/14 10:17

* @version:1.0

*/

public class Cake {

}

定义苹果味的蛋糕

/**

* 苹果蛋糕

* @author:liyajie

* @createTime:2022/2/14 10:17

* @version:1.0

*/

public class AppleCake extends Cake{

public AppleCake(){

System.out.println("创建了苹果蛋糕实例");

}

}

定义香蕉味的蛋糕

/**

* 香蕉蛋糕

* @author:liyajie

* @createTime:2022/2/14 10:17

* @version:1.0

*/

public class BananaCake extends Cake{

public BananaCake(){

System.out.println("创建了香蕉蛋糕实例");

}

}

定义蛋糕工厂类

/**

* 蛋糕工厂

* @author:liyajie

* @createTime:2022/2/14 10:16

* @version:1.0

*/

public class CakeFactory {

public Cake createCake(String type){

if("apple".equals(type)){

return new AppleCake();

}else if("banana".equals(type)){

return new BananaCake();

}else {

return null;

}

}

}

定义测试类

/**

* 测试类

* @author:liyajie

* @createTime:2022/2/14 10:25

* @version:1.0

*/

public class Test {

public static void main(String[] args) {

CakeFactory cakeFactory = new CakeFactory();

cakeFactory.createCake("apple");

cakeFactory.createCake("banana");

}

}

查看结果:

方案二:工厂方法模式

定义蛋糕父类

/**

* 蛋糕父类

* @author:liyajie

* @createTime:2022/2/14 10:44

* @version:1.0

*/

public abstract class Cake {

}

定义苹果蛋糕

/**

* 苹果蛋糕

* @author:liyajie

* @createTime:2022/2/14 10:17

* @version:1.0

*/

public class AppleCake extends Cake {

public AppleCake(){

System.out.println("创建了苹果蛋糕实例");

}

}

定义香蕉蛋糕

/**

* 香蕉蛋糕

* @author:liyajie

* @createTime:2022/2/14 10:17

* @version:1.0

*/

public class BananaCake extends Cake {

public BananaCake(){

System.out.println("创建了香蕉蛋糕实例");

}

}

定义蛋糕工厂类 该类主要是定义了createCake抽象方法,并且在无参构造函数中进行调用,具体的实现是在子类里进行实例化的

/**

* 蛋糕工厂类

* @author:liyajie

* @createTime:2022/2/14 11:55

* @version:1.0

*/

public abstract class CakeFactory {

abstract Cake createCake();

public CakeFactory() {

createCake();

}

}

定义苹果蛋糕工具类

/**

* @desc:

* @author:liyajie

* @createTime:2022/2/14 11:58

* @version:1.0

*/

public class AppleCakeFactory extends CakeFactory{

@Override

public Cake createCake() {

return new AppleCake();

}

}

定义香蕉蛋糕工具类

/**

* @desc:

* @author:liyajie

* @createTime:2022/2/14 11:58

* @version:1.0

*/

public class BananaCakeFactory extends CakeFactory{

@Override

public Cake createCake() {

return new BananaCake();

}

}

定义测试类

/**

* 测试类

* @author:liyajie

* @createTime:2022/2/14 12:02

* @version:1.0

*/

public class Test {

public static void main(String[] args) {

AppleCakeFactory appleCakeFactory = new AppleCakeFactory();

BananaCakeFactory bananaCakeFacbIoHGQhonctory = new BananaCakeFactory();

}

}

查看结果

方案三:抽象工厂模式

定义蛋糕父类

/**

* @desc:

* @author:liyajie

* @createTime:2022/2/14 10:44

* @version:1.0

*/

public abstract class Cake {

}

定义苹果蛋糕

/**

* 苹果蛋糕

* @author:liyajie

* @createTime:2022/2/14 10:17

* @version:1.0

*/

public class AppleCake extends Cake {

public AppleCake(){

System.out.println("创建了苹果蛋糕实例");

}

}

定义香蕉蛋糕

/**

* 香蕉蛋糕

* @author:liyajie

* @createTime:2022/2/14 10:17

* @version:1.0

*/

public class BananaCake extends Cake {

public BananaCake(){

System.out.println("创建了香蕉蛋糕实例");

}

}

定义蛋糕工厂类

/**

* @desc:

* @author:liyajie

* @createTime:2022/2/14 11:55

* @version:1.0

*/

public interface CakeFactory {

Cake createCake();

}

定义苹果蛋糕工厂类

/**

* @desc:

* @author:liyajie

* @createTime:2022/2/14 11:58

* @version:1.0

*/

public class AppleCakeFactory implements CakeFactory {

@Override

public Cake createCake() {

return new AppleCake();

}

}

定义香蕉蛋糕工厂类

/**

* @desc:

* @author:liyajie

* @createTime:2022/2/14 11:58

* @version:1.0

*/

public class BananaCakeFactory implements CakeFactory {

@Override

public Cake createCake() {

return new BananaCake();

}

}

定义蛋糕工厂生成器

/**

* @desc:

* @author:liyajie

* @createTime:2022/2/14 17:46

* @version:1.0

*/

public class FactoryProducter {

CakeFactory cakeFactory;

public FactoryProducter(CakeFactory cakeFactory){

setCakeFactory(cakeFactory);

}

public void setCakeFactory(CakeFactory cakeFactory){

this.cakeFactory = cakeFactory;

cakeFactory.createCake();

}

}

定义测试类

/**

* 测试类

* @author:liyajie

* @createTime:2022/2/14 12:02

* @version:1.0

*/

public class Test {

public static void main(String[] args) {

new FactoryProducter(new AppleCakeFactory());

new FactoryProducter(new BananaCakeFactory());

}

}

查看结果

对比分析

方案一:简单工厂模式,工厂类是只有一个,只需要改动这一个地方 避免了业务逻辑的代码和创建对象的代码大量耦合,降低耦合 让代码更加条理清晰,更加优雅方案二:工厂方法模式是简单工厂模式的衍生,定义一个创建对象的抽象方法,由子类决定要实例化的类,将对象实例化延迟到子类,实现了可扩展,层次结构更复杂,可以应用到更复杂的场合方案三:抽象工厂模式,定义一个接口来用于创建相关的或者具有依赖关系的对象簇,将实例化对象的细节提取出来,放到工厂角色,由工厂角色负责具体的创建细节,解耦合,提高项目可扩展性和可维护性

总结

通过以上三个案例,对比分析我们明确了三种工厂模式实现的方式,也对比分析了各个工厂模式的优点。但是切记,实际开发过程中,不要盲目的使用,一定要结合具体的业务,实际分析后才去使用。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:pytest之allure(二)之添加测试用例步骤(@allure.step())
下一篇:pytest之allure(四)之为测试用例添加描述(@allure.description())(pytest allure自动化框架)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~