抽象工厂模式
程序员文章站
2022-04-04 14:12:51
...
设计模式之禅学习之抽象工厂模式
1、抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。工厂方法模式中的工厂生产的往往都是同一级别的产品(比如生产的就是人);而抽象工厂模式的工厂生产的产品是分等级的(比如生产的是男人和女人,虽然都是人,但是是多品种)。用抽象工厂模式是一般都是多业务品种,多业务分类,会有多个工厂实现类,来生产不用业务品种。
2、产品类的等级,也就是产品是分种类的:
下面用代码实现上图中的产品分类逻辑:
首先定义最上面的产品接口:
package com.wang.factoryPattern.abstractF; /** * 产品接口定义 * @author HeJW * */ public interface IProduct { //每个产品共有的方法 public void shareMethod(); //每个产品相同的方法,不同的实现 public abstract void doSomething(); }
然后是抽象产品的分类:
package com.wang.factoryPattern.abstractF; public class Product1Factory implements IProductFactory { @Override public AbstractProductA productAFactory() { return new ProductA1(); } @Override public AbstractProductB productBFactory() { return new ProductB1(); } }
这里只给出了一种分类,实际项目中应该是多中的,我们可以在定义多个实现,
在往下就是具体的产品类的。只要分别实现抽象产品就可以了。一下是一个例子:
package com.wang.factoryPattern.abstractF; public class ProductA1 extends AbstractProductA { @Override public void doSomething() { System.out.println("产品A的第1个实现"); } }
3、创建工厂。创建工厂接口时,应该按产品的分类,分别定义生产这种产品的工厂方法:
package com.wang.factoryPattern.abstractF; /** * 抽象工厂定义 * @author HeJW * */ public interface IProductFactory { //A系类产品工厂 public AbstractProductA productAFactory(); //B系类产品工厂 public AbstractProductB productBFactory(); }
实现该工厂接口时,分别实现产品实例即可,以下是一个工厂实现的例子:
package com.wang.factoryPattern.abstractF; public class Product1Factory implements IProductFactory { @Override public AbstractProductA productAFactory() { return new ProductA1(); } @Override public AbstractProductB productBFactory() { return new ProductB1(); } }
4、编写一个场景类:
package com.wang.factoryPattern.abstractF; public class App { public static void main(String[] args) { IProductFactory factory1 = new Product1Factory(); IProductFactory factory2 = new Product2Factory(); AbstractProductA pa1 = factory1.productAFactory(); pa1.doSomething(); AbstractProductA pa2 = factory2.productAFactory(); pa2.doSomething(); AbstractProductB pb1 = factory1.productBFactory(); pb1.doSomething(); AbstractProductB pb2 = factory2.productBFactory(); pb2.doSomething(); } }
附上工程代码,欢迎下载
上一篇: 网站性能优化的措施
下一篇: 持续总结——coding注意事项