UML关系简单介绍
UML简单使用的介绍
创建型设计模式
Android设计模式-单例模式
Android设计模式-工厂模式
Android设计模式-抽象工厂模式
Android设计模式-建造者模式
Android设计模式-原型模式
结构型设计模式
Android设计模式-代理模式
Android设计模式-装饰模式
Android设计模式-适配器模式
Android设计模式-组合模式
Android设计模式-门面模式
Android设计模式-桥接模式
Android设计模式-享元模式
行为型设计模式
Android设计模式-策略模式
Android设计模式-命令模式
Android设计模式-责任链模式
Android设计模式-模版方法模式
Android设计模式-迭代器模式
Android设计模式-观察者模式
Android设计模式-备忘录模式
Android设计模式-中介者模式
Android设计模式-访问者模式
Android设计模式-状态模式
Android设计模式-解释器模式
1.定义
为创建一组相关或者相互依赖的对象提供一个接口,而且无需指定他们的具体实现类
2.抽象工厂模式UML图
抽象工厂UML图角色介绍
- client 客户端,调用场景
- AbstractFactory 抽象工厂类
- ConcreteFactory 具体工厂类
- AbstractProduct 抽象产品类
- ConcreteProduct 具体产品类
3.实现
举例说明:一个抽象工厂,有两个具体的实现,分别为Factory1和Factory2,分别生产数字为1和为2的产品
3.1抽象工程类
public abstract class AbstractFactory {
public abstract AbstractProductA createA();
public abstract AbstractProductB createB();
}
3.2具体工厂类
public class Factory1 extends AbstractFactory {
//1工厂生产产品为1的产品
@Override
public AbstractProductA createA() {
return new ProductA1();
}
//1工厂生产产品为1的产品
@Override
public AbstractProductB createB() {
return new ProductB1();
}
}
public class Factory2 extends AbstractFactory {
//2工厂生产产品为2的产品
@Override
public AbstractProductA createA() {
return new ProductA2();
}
//2工厂生产产品为2的产品
@Override
public AbstractProductB createB() {
return new ProductB2();
}
}
3.3抽象产品类
public abstract class AbstractProductA {
//产品共有的方法
public void a1(){
}
//每个产品不同的实现
public abstract void a2();
}
public abstract class AbstractProductB {
//产品共有的方法
public void b1(){
}
//每个产品不同的实现
public abstract void b2();
}
3.4 具体产品
public class ProductA1 extends AbstractProductA {
@Override
public void a2() {
System.out.println("我是产品A1");
}
}
public class ProductA2 extends AbstractProductA {
@Override
public void a2() {
System.out.println("我是产品A2");
}
}
public class ProductB1 extends AbstractProductB {
@Override
public void b2() {
System.out.println("我是产品B1");
}
}
public class ProductB2 extends AbstractProductB {
@Override
public void b2() {
System.out.println("我是产品B2");
}
}
3.5场景调用
public class MyClass {
public static void main(String args[]) {
AbstractFactory factory1=new Factory1();
AbstractFactory factory2=new Factory2();
AbstractProductA a1=factory1.createA();
AbstractProductA a2=factory2.createA();
AbstractProductB b1=factory1.createB();
AbstractProductB b2=factory2.createB();
a1.a2();
a2.a2();
b1.b2();
b2.b2();
}
}
//打印结果
我是产品A1
我是产品A2
我是产品B1
我是产品B2
4.总结
- 抽象工厂模式有良好的封装性,但是扩展性却很差,如以上的例子,如果要增加一个C产品,那么抽象工厂和具体工厂都需要修改。但是如果只是增加一个产品等级3,那么只需要增加一个具体工厂和产品类即可,也就是说横向扩展容易,纵向扩展难,但是横向纵向的设定,还是看自己设计了,你完全可以将产品等级设计为纵向,产品类型设计为横向,结果也就反了过来,所以具体设计的时候,要想清楚了。
- 使用场景:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
- 工厂模式与抽象工厂模式的区别,简单来说,就相当于工厂模式是只有一条生产线的工厂,而抽象工厂模式是具有多条生产线的工厂。
网友评论