作者:haibiscuit
时间:2019:3:13
您的star是我不断前行的动力
https://github.com/haibiscuit
转载请说明出处
一:抽象工厂模式
定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。
使用场景:1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
例如:
创建Spring风格的浅绿色的按钮,
绿色边框的文本框,
绿色边框的组合框
创建Summer风格的浅蓝色的按钮,
蓝色边框的文本框,
蓝色边框的组合框
示例:
//目标创建类
interface Button{
void display();
}
class SpringButton implements Button{
@Override
public void display(){
System.out.println("Spring风格Button");
}
}
class SummerButton implements Button{
@Overrider
public void display(){
System.out.println("Spring风格Button");
}
}
//文本框、组合框的实现和Button一样
//以下是抽象工厂类的实现
interface SkinFactory{
Button createButton();
TextField createTextField();
comboBox createComboBox();
}
//Spring风格的工厂实现类
class SpringSkinFactory implements SkinFactory{
@Override
public Button createButton(){
return new SpringButton();
}
@Override
public TextField createTextField(){
return new SpringTextField();
}
@Override
public comboBox createComboBox(){
return new SpringComboBox();
}
}
//Summer风格的工厂实现类
class SpringSkinFactory implements SkinFactory{
@Override
public Button createButton(){
return new SummerButton();
}
@Override
public TextField createTextField(){
return new SummerTextField();
}
@Override
public comboBox createComboBox(){
return new SummerComboBox();
}
}
class Test{ //为了实现开闭原则,可以将工厂的具体实现类的路径写在xml中,利用反射来生成对象,这里只是简单的new一下,具体参考适配器中的示例
public static void main(String []args){
SkinFactory factory;
Button button;
factory = new SpringSkinFactory();
button = factory.createButton();
button.display();
}
}
总结:
1.产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
2.但是这里的可扩展性就有点烦,比如以上实现了Summer和Spring风格的Button,TextField,ComboBox,
如果我想实现Winter风格的,需要分别继承Button,TextField,ComboBox实现新的类,同样需要继承SkinFactory工厂类,实现WinterSkinFactory工厂实现类。