设计模式——抽象工厂模式

作者:haibiscuit

时间:2019:3:13

您的star是我不断前行的动力

https://github.com/haibiscuit

转载请说明出处

:抽象工厂模式

    定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

    使用场景:1QQ 换皮肤,一整套一起换。 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.但是这里的可扩展性就有点烦,比如以上实现了SummerSpring风格的ButtonTextFieldComboBox

    如果我想实现Winter风格的,需要分别继承ButtonTextFieldComboBox实现新的类,同样需要继承SkinFactory工厂类,实现WinterSkinFactory工厂实现类。

 

原文地址:https://www.cnblogs.com/haibiscuit/p/10526865.html