简单工厂模式
简单工厂模式也被称为静态工厂模式;使用简单工厂模式可以将产品的“消费”和生产完全分开,客户端只需要知道自己需要什么产品,如何来使用产品就可以了,具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。
优点
- 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端与产品的创建分离,客户端可以免除直接创建产品对象的责任,不需要知道产品创建的逻辑,而仅仅工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点
- 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
- 同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
- 另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构
- 工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则
使用场景
- 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,则可以选用简单工厂。让客户端通过工厂来获取相应的接口,而无需关心具体的实现。
- 如果想要把对外创建对象的职责集中管理 和控制,可以选用简单工厂
实现
简单工厂模式的构成
具体的工厂角色:Factory;在工厂中可以调用方法生产出具体的某个类型的产品; 抽象的产品角色:Father_Product;在抽象产品类型中可以声明抽象接口,在具体的产品类中实现; 具体的产品角色:Ex_Product_1 和Ex_Product_2;在具体的类中必须实现抽象类的接口,也可以实现自己的业务逻辑。
简单工厂模式的UML
代码实现
别诟病我这中文写代码,问就是不是做项目,这样更容易知道自己写的啥!
代码语言:javascript复制package 简单工厂模式;
public abstract class Father_Product { //定义产品的父类
String Attribute; //产品必备属性
public abstract void Method(); //产品的功能
}
代码语言:javascript复制package 简单工厂模式;
public class Ex_Product_1 extends Father_Product {
@Override
public void Method() {
System.out.println("我是第一种产品,这是我的功能");
}
}
代码语言:javascript复制package 简单工厂模式;
public class Ex_Product_2 extends Father_Product {
@Override
public void Method() {
System.out.println("我是第二种产品,这是我的功能");
}
}
代码语言:javascript复制package 简单工厂模式;
public class Factory {
public Father_Product createProduct(String productName) {
Father_Product product = null;
switch(productName){
case "1":
product = new Ex_Product_1();//生产产品1
break;
case "2":
product = new Ex_Product_2();//生产产品2
break;
default:
break;
}
return product;
}
}
:
写在最后: 我叫风骨散人,名字的意思是我多想可以不低头的自由生活,可现实却不是这样。家境贫寒,总得向这个世界低头,所以我一直在奋斗,想
改变我的命运
给亲人好的生活,希望同样被生活绑架的你
可以通过自己的努力改变现状,深知成年人的世界里没有容易二字。目前是一名在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你! 如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文! 谢谢大家的阅读!?