网站开发商外包,功能网站开发多少钱,昆明营销型网站建设公司,android开发下载wordpress一、什么是工厂模式 工厂模式属于创建型设计模式#xff0c;它用于解耦对象的创建和使用。通常情况下#xff0c;我们创建对象时需要使用new操作符#xff0c;但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口#xff0c;使得我们可以在不暴露…一、什么是工厂模式 工厂模式属于创建型设计模式它用于解耦对象的创建和使用。通常情况下我们创建对象时需要使用new操作符但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口使得我们可以在不暴露对象创建逻辑的情况下创建对象。
二、工厂分类 工厂模式分为三种类型简单工厂、方法工厂和抽象工厂其本质就是对获取对象过程的抽象。
三、应用场景 3.1 生活场景 你需要一辆汽车可以直接从工厂里提货而不用关心它具体是怎么实现的 Hibernate换数据库只需要换方言和驱动就可以 3.2 java场景 BeanFactory它是Spring IoC容器的核心接口通过读取配置文件或注解来创建Bean实例并将它们注入到其他对象中。BeanFactory使用了工厂模式来隐藏具体的对象实例化过程客户端只需要通过接口获取Bean对象而不需要关心具体的实例化细节。 FactoryBean是一种更高级别的工厂模式实现用于创建特定类型的Bean对象。与普通的BeanFactory不同FactoryBean的getObject()方法可以返回任意类型的对象实例并且可以通过配置方式创建和管理实例。 Executors提供了一系列的工厂方法来创建线程池ThreadPoolExecutor及其相关组件。 Charset提供了一系列的静态工厂方法如forName()、availableCharsets()等用于创建Charset实例。 4.1 传统模式 在介绍工厂模式之前先来看看传统模式以卖包子为例如下 //简单的制作流程
public BaoZi createBaoZi() {BaoZi baozi new BaoZiImpl();//准备材料baozi.prepare();//制作包子baozi.make();//蒸包子baozi.braise();return baozi;
}包子肯定有很多种类吧那我们可以直接在上述代码中添加根据包子的种类生成不同类型的对象
/**
* 包子肯定有不同的馅酸菜、豆沙、猪肉那么他的材料、售价等方式也不同
* 我们可以直接在上述代码中添加根据包子的不同种类生成不同的对象。
*/
public BaoZi createBaoZi(String type) {BaoZi baoZi null;switch (type){case suancai:baoZinew SuanCaiBaoZi();break;case dousha:baoZinew DouShaBaoZi();break;case pork:baoZinew PorkBaoZi();break;default:throw new IllegalArgumentException(Invalid BaoZi Type);}//准备材料baoZi.prepare();//制作包子baoZi.make();//蒸包子baoZi.braise();return baoZi;
}Test: //1.传统模式Testvoid traditonal(){SaleBaoZi saleBaoZinew SaleBaoZi();//以猪肉包为例saleBaoZi.createBaoZi(pork);}4.2 简单工厂模式 简单工程根据客户端的需求创建具体的实例这种模式对调用者隐藏了实例创建的过程也使得创建过程更加容易维护。
还是以卖包子为例简单工厂模式实现如下 /*** 2.简单工厂方法:希望能够创建一个对象但创建过程比较复杂希望对外隐藏这些细节*/
public class SimpleFactory {public static BaoZi createBaoZi(String type){BaoZi baoZinull;switch (type){case suancai:baoZinew SuanCaiBaoZi(酸菜包);break;case dousha:baoZinew DouShaBaoZi(豆沙包);break;case pork:baoZinew PorkBaoZi(猪肉包);case beef://老板拓展业务了新加了一个牛肉包类型的包子那对于简单工厂模式而言//于是就得修改源代码那么就违反了ocp原则假如新增100个baoZinew BeefBaoZi(牛肉包);break;default:throw new IllegalArgumentException(Invalid BaoZi Type);}return baoZi;}
}
Test: //2.简单工厂模式Testvoid simpleFactory(){//以猪肉包为例BaoZi pork SimpleFactory.createBaoZi(pork);pork.prepare();pork.make();pork.braise();}相比传统模式从类图上就可以看出来在sale和baozi中间又加了一层。
通过封装SimpleFactory这个类我们将sale和baozi进行了解耦合。 4.3 方法工厂模式 简单工厂模式下如果老板拓展业务了加了一个牛肉种类的包子就得在源码基础上修改那么这就违背了开闭原则ocp即对扩展开放对修改关闭。于是为了解决这个问题就又了工厂方法模式。
工厂方法模式是一种更加抽象的工厂模式它将工厂的职责抽象为接口由具体的工厂实现创建具体的对象。工厂方法模式弱化了工厂的实现使得每个工厂只负责一个产品的创建。
抽象工厂MeAbStractFactory
public interface MeAbstractFactory {BaoZi createBaoZi();
}DouShaFactory
//豆沙包
public class DouShaFactory implements MeAbstractFactory {Overridepublic BaoZi createBaoZi() {return new DouShaBaoZi(豆沙包);}
}PorkFactory
//猪肉包
public class PorkFactory implements MeAbstractFactory {Overridepublic BaoZi createBaoZi() {return new PorkBaoZi(猪肉包);}
}BeefFactory
//牛肉包
public class BeefFactory implements MeAbstractFactory {Overridepublic BaoZi createBaoZi() {return new BeefBaoZi(牛肉包);}Test //3.方法工厂模式Testvoid methodFactory(){MeAbstractFactory factorynew PorkFactory();BaoZi pork factory.createBaoZi();pork.prepare();pork.make();pork.braise();}之前的SimpleFactory在createBaoZi中直接就new出来了但在方法工厂中我们将createBaoZi这个动作推迟到了MeAbStactFactory的子类XXFactory中才完成。
好处就是比如后期要卖个羊肉包我们直接编写个羊肉包类然后实现MeAbstractFactory类就实现它自己的功能这样完全不用修改原来的代码了也就解决了违反OCP原则的问题。
4.4 抽象工厂模式 抽象工厂模式是基于工厂方法模式的基础上进行的。在这种模式中每一个工厂不再只负责一个产品的创建而是负责一组产品的创建。抽象工厂模式将每个产品组都提取为一个接口每个工厂都负责一个产品组。 假如老板的生意做大了在北京开了个分店并且不止卖包子还卖蛋糕那么该怎么拓展呢很简单只需要在抽象工厂类中新增创建蛋糕的抽象方法就行如下AbstractFactorypublic interface AbstractFactory {//制作包子BaoZi createBaoZi(String type);//制作蛋糕Cake createCake(String type);
}BJFactory
//北京分店
public class BJFactory implements AbstractFactory{Overridepublic BaoZi createBaoZi(String type) {BaoZi baoZinull;switch (type){case beef:baoZinew BJBeefBao(北京牛肉包);break;case pork:baoZinew BJPorkBao(北京猪肉包);default:break;}return baoZi;}Overridepublic Cake createCake(String type) {Cake cakenull;switch (type){case apple:cakenew BJAppleCake(北京苹果蛋糕);break;case pear:cakenew BJPearCake(北京梨味蛋糕);default:break;}return cake;}
}Test
//4.抽象工厂模式
Test
void abstractFactory(){AbstractFactory factorynew BJFactory();Cake apple factory.createCake(apple);BaoZi pork factory.createBaoZi(pork);apple.prepare();apple.make();apple.bake();apple.sale();pork.prepare();pork.make();pork.braise();pork.sale();
}5.1 简单工厂模式 优点 简单工厂模式实现简单易于理解和使用 可以对对象的创建进行集中管理客户端和具体实现解耦。 缺点 工厂类负责创建所有对象如果需要添加新类型的产品则需要修改工厂类的代码这违反了开闭原则 工厂类职责过重导致单一职责原则被破坏。 适用场景 工厂类负责创建的对象较少客户端不需要知道对象的创建过程 客户端需要根据传递的参数来获取对应的对象。 5.2 方法工厂模式 优点 方法工厂模式具有良好的可扩展性如果需要添加新类型的产品只需要添加对应的工厂方法即可 与简单工厂模式相比方法工厂模式更符合开闭原则和单一职责原则。 缺点 需要客户端自行选择使用哪个工厂方法不能像简单工厂模式那样直接传参获取对应对象因此对客户端的编写有一定要求。 适用场景 应用中需要创建的对象较少但是需要具备良好的可扩展性 客户端可以自行选择创建哪种对象。 5.3 抽象工厂 优点 抽象工厂模式可以创建多个产品族的产品这些产品之间有相互依赖或约束关系有助于保持系统的一致性和稳定性 客户端与具体产品解耦通过产品族的方式进行管理。 缺点 抽象工厂模式增加了系统的抽象性和理解难度不易于理解和修改 新增产品族时需要修改工厂接口、工厂实现类和产品类增加了系统的复杂性。 适用场景 系统需要一系列相互依赖或约束的产品 客户端不需要知道具体产品的创建过程只需要知道产品族即可。