抽象工厂

抽象工厂定义

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类(关于这句话的解释请在本文搜索haha)。

需求

不同国家的玩具店都卖自己国家的玩具,所以各个国家都有自己的玩具工厂生产自己国家的玩具供玩具店拿货(中国玩具工厂、外国玩具工厂),各国工厂的共同点是都生产三个等级的玩具,bad、normal、good。

实现

设计抽象工厂

根据需求也就是说生产三个等级的玩具是公共部分,所以我们可以将生产这三种品质玩具的方法抽象出来定义在工厂接口中,而它的实现类可以是中国玩具工厂、外国玩具工厂,它们各自实现三个生产玩具的方法来创建不同国家的不同等级的玩具。
下面是工厂的代码:

//接口工厂
public interface ToyFactory {
   /**
    * 创建差玩具
    */
   Toy createBadToy();

   /**
    * 创建普通玩具
    */
   Toy createNormalToy();

   /**
    * 创建好玩具
    */
   Toy createGoodToy();
}
//接口工厂的实现类
class ChinaToyFactory implements ToyFactory {
   /**
    * 返回中国劣质玩具
    */
   @Override
   public ChinaBadToy createBadToy() {
      return new ChinaBadToy();//haha:在这里你可以看到方法名为createBadToy这个,它没有任何提示要返回哪个国家的玩具,但是会返回一个中国差玩具,即是说,你调用不同工厂的同名方法会得到不同的产品(中国差玩具、美国差玩具),即调用者只需要保证调用的是特定工厂的方法,就可以得到它想要的产品,实现了产品创建和。
   }

   /**
    * 返回中国普通玩具
    */
   @Override
   public ChinaNormalToy createNormalToy() {
      return new ChinaNormalToy();
   }

   /**
    * 返回中国好玩具
    */
   @Override
   public ChinaGoodToy createGoodToy() {
      return new ChinaGoodToy();
   }
}

设计玩具

根据需求可以知道玩具有国籍之分,如下:
这里写图片描述
所以我们设计玩具实现类为不同国籍与不同等级如下:
这里写图片描述
代码如下:

public interface Toy {
   void printToyInf();
}

class ChinaBadToy implements Toy {

   @Override
   public void printToyInf() {
      System.out.println("中国糟糕玩具");
   }

}
class ChinaNormalToy implements Toy {

   @Override
   public void printToyInf() {
      System.out.println("中国普通玩具");
   }

}
class ChinaGoodToy implements Toy {

   @Override
   public void printToyInf() {
      System.out.println("中国好玩具");
   }
}

设计玩具店

玩具店代码如下:

//玩具店接口
public interface ToyStore {
   Toy getNormalToy();//用来获取一个普通玩具
   Toy getBddToy();//获取一个糟糕的玩具
   Toy getGoodToy();//获取一个好玩具
}
//玩具店实现之一
class ChinaToyStore implements ToyStore {


   final ToyFactory chinaToyFactory;

   ChinaToyStore(ToyFactory toyFactory) {
      this.chinaToyFactory = toyFactory;
   }

   @Override
   public Toy getNormalToy() {//调用工厂的创建方法来获取玩具
      return chinaToyFactory.createNormalToy();
   }

   @Override
   public Toy getBddToy() {//调用工厂的创建方法来获取玩具
      return chinaToyFactory.createBadToy();
   }

   @Override
   public Toy getGoodToy() {//调用工厂的创建方法来获取玩具
      return chinaToyFactory.createGoodToy();
   }
}

客户端代码

public class ToyClient {
    public static void main(String[] args) {
        ToyStore toyStore = new ChinaToyStore(new ChinaToyFactory());
        Toy toy = toyStore.getNormalToy();
        toy.printToyInf();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值