抽象工厂UML类图
上一片我们写了工厂方法模式,我们大致了解了他的运作原理,那么我们具体分析一下工厂方法模式和抽象工厂模式的区别吧
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品的实例
抽象工厂模式:
多个抽象产品类,每个抽象产品可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类可以创建多个具体产品类的实例
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个
知道了具体区别,下面看一个抽象工厂类的具体实例吧
//抽象产品类
public abstract class ProductA {
/**
* 每个具体产品子类需要实现的方法
* @return
*/
public abstract String method();
}12345678
//抽象产品类
public abstract class ProductB {
/**
* 每个具体产品子类需要实现的方法
* @return
*/
public abstract String method();
}12345678
//具体产品
public class ConcreteProductA1 extends ProductA {
@Override
public String method() {
return "我是具体产品A1";
}
}1234567
//具体产品
public class ConcreteProductA2 extends ProductA {
@Override
public String method() {
return "我是具体产品A2";
}
}1234567
//具体产品
public class ConcreteProductB1 extends ProductB {
@Override
public String method() {
return "我是具体产品B1";
}
}1234567
//具体产品
public class ConcreteProductB2 extends ProductB {
@Override
public String method() {
return "具体产品B2";
}
}
12345678
//抽象工厂
public abstract class AbstractFactory {
/**
* 创建A的方法
* @return
*/
public abstract ProductA createproductA();
/**
* 创建B的方法
* @return
*/
public abstract ProductB createproductB();
}1234567891011121314151617
//具体工厂
public class ConcreteFactory1 extends AbstractFactory {
@Override
public ProductA createproductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createproductB() {
return new ConcreteProductB1();
}
}123456789101112
//具体工厂
public class ConcreteFactory2 extends AbstractFactory {
@Override
public ProductA createproductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createproductB() {
return new ConcreteProductB2();
}
}123456789101112
具体调用
public class AbFactoryActivity extends BaseActivity {
@Override
public int setMainView() {
return R.layout.activity_ab_factory;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setToobarTitle("抽象工厂模式");
TextView textView = (TextView) findViewById(R.id.abfactory_text1);
TextView textView1 = (TextView) findViewById(R.id.abfactory_text2);
ConcreteFactory1 concreteFactory1 = new ConcreteFactory1();
String method = concreteFactory1.createproductA().method();
String method1 = concreteFactory1.createproductB().method();
textView.setText(method + method1);
ConcreteFactory2 concreteFactory2 = new ConcreteFactory2();
String method2 = concreteFactory2.createproductA().method();
String method3 = concreteFactory2.createproductB().method();
textView1.setText(method2 + method3);
}
}