设计模式之简单工厂模式
简单工厂--导读
在现实生活中存在很多工厂他们负责具体物品的生产,大大的提高了我们的生活质量,使得我们只需要知道如何去使用生产出来的东西而不需要如何去制作,
简单工厂就是相当于现实中的工厂,当我们需要使用一大堆实体类时,如果我们没有工厂那么我们需要一个一个的去创建,当我们需要加入一个新的实体类时
又要修改相对应得操作,这无疑是很麻烦的,当我们有简单工厂时,我们仅需传入对应的参数,就可以直接获得对应的对象,而不需要创建对象的操作,同时也
使得使用者和实体类之间松耦合,拓展起来更加方便。
简单工厂--定义
简单工厂叫静态工厂方法,属于创建型模式。在简单工厂模式中,可以根据传递的参数不同,返回不同类的实例。简单工厂模式定义了一个类,这个类专门用于创建其他类的实例,这些被创建的类都有一个共同的父类,用来创建一系列的实例。
简单工厂--模式
模式结构图如下:
模式分析:
Factory:工厂角色。专门用于创建实例类的工厂,提供一个方法,该方法根据传递的参数不同返回不同类的具体实例。
Product:抽象产品角色。为所有产品的父类。
ConcreteProduct:具体的产品角色。
简单工厂模式将对象的创建和对象本身业务处理分离了,可以降低系统的耦合度,使得两者修改起来都相对容易些。当以后实现改变时,只需要修改工厂类即可
简单工厂--实现
以生产汽车为例,对于一个品牌的汽车生产厂会生产不同类型的汽车,而这时就需要工厂方法来进行实现了:
carfactory用于跟据需求来生产不同类型的车
/** * 工厂,提供一个方法用于生产不同的产品 * @author liu * */ public class CarFactory { private CarInf car=null; public CarInf createCar(String type) { if(type.equals("cheap")) { car=new CheapCar(); }else { car=new ExpensiveCar(); } return car; } }
CarInf表示某一品牌的车
package Factory_Method_Pattern; /** * 定义一系列的产品 * @author liu * */ public interface CarInf { public void run(); public void accelerate(); public void quality(); public void price(); public void sets(); }
cheapCar表示该品牌牌便宜的车
package Factory_Method_Pattern; public class CheapCar implements CarInf { public void run() { System.out.println("引擎很差,跑的慢"); } public void accelerate() { // TODO Auto-generated method stub System.out.println("加速很慢,很耗油"); } public void quality() { // TODO Auto-generated method stub System.out.println("质量非常的差"); } public void price() { // TODO Auto-generated method stub System.out.println("价格非常的便宜"); } public void sets() { // TODO Auto-generated method stub System.out.println("人造革很硬"); } }
ExpensiveCar表示该品牌比较昂贵的车
package Factory_Method_Pattern; public class ExpensiveCar implements CarInf{ @Override public void run() { // TODO Auto-generated method stub System.out.println("引擎好跑的很快"); } @Override public void accelerate() { // TODO Auto-generated method stub System.out.println("加速很慢,很节油"); } @Override public void quality() { // TODO Auto-generated method stub System.out.println("质量非常好"); } @Override public void price() { // TODO Auto-generated method stub System.out.println("价格非常昂贵"); } @Override public void sets() { // TODO Auto-generated method stub System.out.println("真皮沙发很舒适"); } }
client表示现如今的用户
package Factory_Method_Pattern; /*** * 简单工厂客户端 * @author liu * */ public class client { public static void main(String[] args) { //客户端仅仅需要知道工厂,便可以购买自己想要的汽车 CarFactory factory=new CarFactory(); CarInf car=factory.createCar("cheap"); car.accelerate(); car.price(); } }
简单工厂————优缺点
优点
1、简单工厂模式实现了对责任的分割,提供了专门的工厂类用于创建对象。
2、客户端无需知道如何具体的创建出某一项具体的产品,仅需知道该工厂和自己所需产品的类型即可
3、通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点
1、由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2、使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
4、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
简单工厂--使用场景
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。