抽象工厂

      前述:在之前的工厂方法中,我们定义了一个CarFactory(接口),WulingFactory(接口的实现类),来生产具体品牌的车。但是由于每个Factory只能生产车这一个单一的产品,当提系统要生产的产品众多时,就需要定义多geFactory接口就会使得系统的开销大大提高。因此我们提出了抽象工厂这一思想。

              在抽象工厂中ProductFactory(接口)中可以生产多种产品(如:手机,路由器等),不同的生产商(HuaWeiFactory)实现该接口,来生产自己的产品(华为手机,华为路由器),与产品方法不同之处就是工厂中可以生产的产品种类多了。

      两个概念: 产品族:工厂中可以生产的所有种类产品称为产品族,如:ProductFactory中可以生产 手机,路由器等 这就是一个产品族。

                                        在下图中就是YiliFactory可以生产原味,草莓味酸奶。 

                         产品等级:就是产品的继承结构,如:iPhone(接口),具体的有HUAWEIiPhone,XiaomiiPhone,这就是一个产品等级。

 

         抽象工厂中的类和接口:(接口就是一种约束!!!)

AbstractFactory(抽象工厂 接口):里面定义了一些产品的生产方法,这些产品称为一个产品族。

ConcreteFactory(具体工厂 类):实现了抽象工厂接口,来生产自己的具体产品,这些产品也是产品族。

iPhone(手机 接口):定义了要实现手机应具备的功能,是所有手机产品的父结构,这就是一个产品等级的概念。

HUAWEIPhone(手机  类):实现了手机接口。

       具体代码的实现:

定义两个父产品结构:

//手机产品接口
public interface IphoneProduct {

    void open();
    void shutdown();
    void call();
    void sendms();


}



//路由器产品接口
public interface RootProduct {

    void open();
    void close();
    void safe();
}

 

HUAWEIIPhone,HuaWeiRoot,XiaomiIPhone,XiaomiRoot:(产品接口的实现)

//华为手机
public class HuaweiIphone implements IphoneProduct {
    @Override
    public void open() {
        System.out.println("华为手机开启");
    }

    @Override
    public void shutdown() {
        System.out.println("华为手机关闭");
    }

    @Override
    public void call() {
        System.out.println("华为手机打电话");
    }

    @Override
    public void sendms() {
        System.out.println("华为手机发短信");
    }
}



//华为路由器
public class HuaweiRoot implements RootProduct {
    @Override
    public void open() {
        System.out.println("华为路由器开启");
    }

    @Override
    public void close() {
        System.out.println("华为路由器关闭");
    }

    @Override
    public void safe() {
        System.out.println("华为路由器安全");
    }
}



//小米手机
public class XiaomiIphone implements IphoneProduct {
    @Override
    public void open() {
        System.out.println("小米手机开启");
    }

    @Override
    public void shutdown() {
        System.out.println("小米手机关闭");
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }

    @Override
    public void sendms() {
        System.out.println("小米手机发短信");
    }
}


//小米路由器
public class Xiaomiroot implements RootProduct {
    @Override
    public void open() {
        System.out.println("小米路由器开启");
    }

    @Override
    public void close() {
        System.out.println("小米路由器关闭");
    }

    @Override
    public void safe() {
        System.out.println("小米安全");
    }
}

     抽象工厂:(接口 可以生产一个产品族)

//抽象工厂  生产 手机,路由器
//抽象的抽象
public interface IProductFactory {

    IphoneProduct getIphone(); //生产手机

    RootProduct getRoot();  //生产路由器

}

     具体工厂(小米工厂,HUAWEI工厂):

//小米工厂 生产小米的手机 路由器
public class XiaomiFactory implements IProductFactory {
    @Override
    public IphoneProduct getIphone() {
        return new XiaomiIphone();
    }

    @Override
    public RootProduct getRoot() {
        return new Xiaomiroot();
    }
}


//华为工厂  生产华为的手机  路由器
public class HuaweiFactory implements IProductFactory {
    @Override
    public IphoneProduct getIphone() {
        return new HuaweiIphone();
    }

    @Override
    public RootProduct getRoot() {
        return new HuaweiRoot();
    }
}

 

      消费者示例:

public class Client {

    public static void main(String[] args) {

        //小米系列产品
        System.out.println("你好 这里是小米之家!==============");
        //小米工厂
        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        IphoneProduct xiaomiFactoryIphone = xiaomiFactory.getIphone();
        xiaomiFactoryIphone.call();
        xiaomiFactoryIphone.open();

        //华为工厂
        System.out.println("欢迎来到华为!");
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        IphoneProduct iphone = huaweiFactory.getIphone();
        iphone.open();
        iphone.call();


    }
}

 

 

posted @ 2019-11-05 13:50  德鲁大叔817  阅读(178)  评论(0)    收藏  举报