• 【设计模式】——抽象工厂模式


    抽象工厂模式描述:

    提供对象的使用接口,隐藏对象的创建过程。比如涉及到系列家族。

    场景:

    1.系统独立于她的产品创建、组合和表示。无需关注内部是如何创建的,怎么创建的。

    2.系统需要多个产品组合中的一种组合。

    3.强调对象的组合结果,而不是他们具体的接口和实现。

                                                                 

    AbstractFactory 提供创建对象的接口。

    ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。

    AbstractProduct 提供对象的使用接口。

    ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。

    Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。

    代码结构:

    例如:画一个头像,这个头像可能是男孩的也可能是女孩的;可以是元旦主题的,也可以是圣诞主题的。

    AbstactFactory.java

    interface AbstractFactory {
        public AbstractProductA CreateProductA();
        public AbstractProductB CreateProductB();
    }

    相同如下   PersonFactory.java

    public interface PersonFactory {
        public Boy createBoy();
        public Girl createGirl();
    }

    ConcreteFactory.java

    class ConcreteFactory1 implements AbstractFactory{
    
        @Override
        public AbstractProductA CreateProductA() {
            return new ConcreteProductA1();
        }
    
        @Override
        public AbstractProductB CreateProductB() {
            return new ConcreteProductB1();
        }
    
    }

    如同

    public class NYFactory implements PersonFactory {
    
        @Override
        public Boy createBoy() {
            return new NYBoy();
        }
    
        @Override
        public Girl createGirl() {
            return new NYGirl();
        }
    
    }

    以及

    public class MCFactory implements PersonFactory {
    
        @Override
        public Boy createBoy() {
            return new MCBoy();
        }
    
        @Override
        public Girl createGirl() {
            return new MCGirl();
        }
    
    }

    AbstractProduct.java

    interface AbstractProductA {
        public void use();
    }
    interface AbstractProductB {
        public void use();
    }

    如同

    public interface Boy {
        public void drawBoy();
    }
    
    
    public interface Girl {
        public void drawGirl();
    }

    ConcreteProduct.java

    class ConcreteProductA1 implements AbstractProductA{
    
        @Override
        public void use() {
            // TODO Auto-generated method stub
            System.out.println("use A1 product!");
        }
    
    }
    class ConcreteProductB1 implements AbstractProductB{
    
        @Override
        public void use() {
            // TODO Auto-generated method stub
            System.out.println("use B1 product!");
        }
    
    }

    如同

    public class MCBoy implements Boy {
    
        @Override
        public void drawMan() {
            System.out.println("一个圣诞系列的男孩");
        }
    
    }
    public class MCGirl implements Girl {
    
    @Override
    public void drawGirl() {
    System.out.println("这是一个圣诞系列的女孩");
    }
    
    }
    
    public class NYBoy implements Boy {
    
    @Override
    public void drawMan() {
    System.out.println("一个新年系列的男孩");
    }
    
    }
    
    public class NYGirl implements Girl {
    
    @Override
    public void drawGirl() {
    System.out.println("这是一个元旦系列的女孩");
    }
    
    }

    使用方式

    public static void main(String[] args){
            AbstractProductA pa;
            AbstractProductB pb;
            
            AbstractFactory fa1 = new ConcreteFactory1();
            pa = fa1.CreateProductA();
            pb = fa1.CreateProductB();
            pa.use();
            pb.use();
            
            AbstractFactory fa2 = new ConcreteFactory2();
            pa = fa2.CreateProductA();
            pb = fa2.CreateProductB();
            pa.use();
            pb.use();
            
        }

    如同下方:

    public class Client {
    
        public static void main(String[] args) {
            NYFactory factory = new NYFactory();
            Boy boy = factory.createBoy();
            boy.drawMan();
            Girl girl = factory.createGirl();
            girl.drawGirl();
        }
    
    }

    如此可以实现一个圣诞或者元旦的男孩或者女孩的任意一种组合。

  • 相关阅读:
    bzoj 4610 Ceiling Functi
    uva 01350
    uva 12075
    uva 01393
    uva 11038
    CF 496E
    CF 496D
    poj 3167
    hdu 4622
    spoj 7258
  • 原文地址:https://www.cnblogs.com/doudingbest/p/4957236.html
Copyright © 2020-2023  润新知