1,工厂方法模式(Factory method)
(1)概念
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个(因为创建者类不需要指定实际创建的产品是哪一个),工厂方法让类把实例化推迟到子类。
是常用的对象创建型设计模式,核心是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
(2)场景:
如:有一大堆不同的Pizza类,只有到了运行是,才能指定优化哪一个。这些是变化的把部分,若菜单改变,这部分代码也要改变。此时,提取出善变的这部分为独立类。
(3)优缺点
优:
将产品的“实现”从“使用”中解耦。
完全实现“开-闭 原则”,实现了可扩展
(4)demo
它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
package factory;
public class Main {
public static void main(String[] args){
/**
* 工厂模式
* 根据FoctoryType:"one""two"不同,让类把实例化推迟到子类
*/
Factory factory = new OneFactory();
Product product = factory.FactoryMethod("one");
System.out.println(product.productName);
product = factory.FactoryMethod("two");
System.out.println(product.productName);
}
}
package factory;/** * 工厂抽象类 * 创建一个框架,让子类决定如何实现具体的产品 * @author luo * */public abstract class Factory { public Product FactoryMethod(String productType){ Product product = CreateProduct(productType); return product; } /** * 让子类去实现要生产什么产品 */ public abstract Product CreateProduct(String productType);}
package factory;/** * 产品抽象类: * 所有产品都有实现这个接口,这样使用这些产品的类久可以引用这个类了 * @author luo * */public abstract class Product { public String productName;}
package factory;/** * 具体产品类 * @author luo * */public class OneProduct extends Product{ public OneProduct(){ productName = "oneProduct"; }}
package factory;/** * 具体产品类 * @author luo * */public class TwoProduct extends Product{ public TwoProduct(){ productName = "twoProduct"; }}
package factory;import java.awt.image.DataBufferUShort;/** * 具体工厂类 * @author luo * */public class OneFactory extends Factory{ @Override public Product CreateProduct(String productType) { switch(productType){ case "one": return new OneProduct(); case "two": return new TwoProduct(); default: break; } return null; } }
2,静态工厂(简单工厂Simple Factory)
(1)概念
利用静态方法定义一个简单的工厂。(注意是一个工厂!)
(2)场景
①工厂类负责创建的对象比较少。
②对象决定创建出哪一种产品类的实例,而对如何创建对象不关心。(例如你到肯德基说你要鸡腿,要薯条,要饮料还是,,,这时肯德基是一个工厂,客户端只需要点明自己要什么就行)。
(3)优缺点
优:
不需要使用创建对象的方法来实例化对象。
缺:
①不能通过继承来改变创建方法的行为。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。
②违反了高内聚责任分配原则。
由于工厂类集中了所有实例的创建逻辑,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
(4)实现:
由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
3,抽象工厂
(1)概念
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
这个接口的每个方法都负责创建一个具体产品,同时我们利用抽象工厂的子类来提供这些具体的做法,利用工厂方法来实现具体工厂。
(2)场景
一个对象族(或者是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式
例如:一个应用需要在三个不同平台上运行,则可以通过抽象工厂模式屏蔽掉操作系统对应用的影响,由不同的产品类去处理与操作系统交互的信息。