上一篇文章讲到简单工厂模式,还没有看到的朋友可以看一下:
Android设计模式之简单工厂模式(一)
简单的工厂模式,使用也比较方便,但是有些细心的朋友也会发现,这种模式也存在不好的缺点,可拓展性差,就是当你要增加一种产品的时候,那么在ProductParent 中你必须加上这种新的产品,必须修改代码,这样子就违反了java的开闭原则,即封闭对代码的修改,开放对代码的拓展。所以今天使用抽象工厂模式,可以规避这种缺点。具体以一个Demo为例。
首先,假设我们有两种不同类型的产品:ProductA,ProductB:
public class ProductA implements ProductParent{
public ProductA() {
System.out.println("生成A产品");
}
}
public class ProductB implements ProductParent{
public ProductB() {
System.out.println("生成B产品");
}
}
再者,我们为这两种产品定义一个共同的总产品接口:ProductParent,并让这两种类型的产品是实现这个接口:
public interface ProductParent {
}
接着,我们分析,既然ProductA和ProductB是不同类型,那么我们再定义这两种产品不同的生产工厂,即:
ProductAFactory,ProductBFactory,ProductAFactory是专门负责生产ProductA产品的,而ProductBFactory
是专门负责生产ProductB产品的,这两个工厂类似于分工厂,只不过生产的产品类型不一样,所以我们再定义一个总工厂IFactory接口,并让分工厂去实现这个接口。代码如下:
public interface IFactory {
ProductParent creatProduceParent();
}
public class ProductAFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductA();
}
}
public class ProductBFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductB();
}
}
通过上面代码可以看到,我们在总工厂IFactory 定义一个生产总产品ProductParent的抽象方法,那么分工厂
ProductAFactory 和ProductBFactory 实现这个方法的时候创建自己的产品ProductA和ProductB。到此,其实
抽象工厂模式的demo已经完了。那么我们怎么使用呢,使用一个测试类TestExample :
public class TestExample {
@Test
public void produce(){
IFactory factory = new ProductAFactory();
ProductParent productA = factory.creatProduceParent();
}
}
在上述代码中,我们作为调用者,只需要创建你需要产品对应的工厂,然后去调用创建的方法就好。那么这种模式为什么说比简单工厂模式好呢,怎样说它就符合开闭原则呢?好,下面就来分析一下,假如公司由于业务拓展,需要新做类型为ProductC的产品,那么此时我们让ProductC去实现总产品ProductParent接口,然后新建一个分工厂ProductCFactory ,并实现总工厂IFactory,在分工厂生产ProductC产品就可以了。
具体代码如下:
public class ProductC implements ProductParent{
public ProductC() {
System.out.println("生成C产品");
}
}
public class ProductCFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductC();
}
}
生产ProductC只需:
IFactory factory = new ProductCFactory();
ProductParent productC = factory.creatProduceParent();
综上所述,我们对原来的代码并未做任何修改,只是增加了ProductC 和ProductCFactory 这两个类,而调用者这需要创建出ProductCFactory就可以生产ProductC了,这就是符合开闭原则了,只拓展不修改,好,本文到此,欢迎指正!!!
Android设计模式之简单工厂模式(一)
简单的工厂模式,使用也比较方便,但是有些细心的朋友也会发现,这种模式也存在不好的缺点,可拓展性差,就是当你要增加一种产品的时候,那么在ProductParent 中你必须加上这种新的产品,必须修改代码,这样子就违反了java的开闭原则,即封闭对代码的修改,开放对代码的拓展。所以今天使用抽象工厂模式,可以规避这种缺点。具体以一个Demo为例。
首先,假设我们有两种不同类型的产品:ProductA,ProductB:
public class ProductA implements ProductParent{
public ProductA() {
System.out.println("生成A产品");
}
}
public class ProductB implements ProductParent{
public ProductB() {
System.out.println("生成B产品");
}
}
再者,我们为这两种产品定义一个共同的总产品接口:ProductParent,并让这两种类型的产品是实现这个接口:
public interface ProductParent {
}
接着,我们分析,既然ProductA和ProductB是不同类型,那么我们再定义这两种产品不同的生产工厂,即:
ProductAFactory,ProductBFactory,ProductAFactory是专门负责生产ProductA产品的,而ProductBFactory
是专门负责生产ProductB产品的,这两个工厂类似于分工厂,只不过生产的产品类型不一样,所以我们再定义一个总工厂IFactory接口,并让分工厂去实现这个接口。代码如下:
public interface IFactory {
ProductParent creatProduceParent();
}
public class ProductAFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductA();
}
}
public class ProductBFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductB();
}
}
通过上面代码可以看到,我们在总工厂IFactory 定义一个生产总产品ProductParent的抽象方法,那么分工厂
ProductAFactory 和ProductBFactory 实现这个方法的时候创建自己的产品ProductA和ProductB。到此,其实
抽象工厂模式的demo已经完了。那么我们怎么使用呢,使用一个测试类TestExample :
public class TestExample {
@Test
public void produce(){
IFactory factory = new ProductAFactory();
ProductParent productA = factory.creatProduceParent();
}
}
在上述代码中,我们作为调用者,只需要创建你需要产品对应的工厂,然后去调用创建的方法就好。那么这种模式为什么说比简单工厂模式好呢,怎样说它就符合开闭原则呢?好,下面就来分析一下,假如公司由于业务拓展,需要新做类型为ProductC的产品,那么此时我们让ProductC去实现总产品ProductParent接口,然后新建一个分工厂ProductCFactory ,并实现总工厂IFactory,在分工厂生产ProductC产品就可以了。
具体代码如下:
public class ProductC implements ProductParent{
public ProductC() {
System.out.println("生成C产品");
}
}
public class ProductCFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductC();
}
}
生产ProductC只需:
IFactory factory = new ProductCFactory();
ProductParent productC = factory.creatProduceParent();
综上所述,我们对原来的代码并未做任何修改,只是增加了ProductC 和ProductCFactory 这两个类,而调用者这需要创建出ProductCFactory就可以生产ProductC了,这就是符合开闭原则了,只拓展不修改,好,本文到此,欢迎指正!!!