工厂方法设计模式

生活场景

简单使用代码描述一个食品的加工和生产的过程,中间涉及到食品种类,生产工厂,工人等系列角色。

食品种类代码描述

package com.cloud.model;

public interface Food {

   //每种食物都有名称

   public void getName();

   //每种食物都有价格

   public void getPrice();

}

package com.cloud.model;

public class FishFood implements Food{

   @Override

   public void getName() {

      System.out.println("这种食物叫做:清蒸海鱼!");

   }

   @Override

   public void getPrice() {

      System.out.println("500块钱一条!");

   }

}

package com.cloud.model;

 

public class DunckFood implements Food{

   @Override

   public void getName() {

      System.out.println("这种食物名称叫做:北京烤鸭!");

   }

   @Override

   public void getPrice() {

      System.out.println("200块钱一只");

   }

}

工厂描述代码

package com.cloud.model;

public abstract class AbstractFoodFactory {

   public abstract <T extends Food> T createFood(Class<T> c);

}

package com.cloud.model;

public class FoodFactory extends AbstractFoodFactory{

   @SuppressWarnings("unchecked")

   @Override

   public <T extends Food> T createFood(Class<T> c) {

      //定义生产的一种食物

      Food food = null;

      try {

         food = (Food) Class.forName(c.getName()).newInstance();

      } catch (Exception e) {

         System.out.println("食物生产中断,出现了异常");

         e.printStackTrace();

      }

      return (T)food;

   }

}

工人生产代码

package com.cloud.model;

public class Worker {

   public static void main(String[] args) {

      //声明一个食物工厂

      AbstractFoodFactory foodFactory = new FoodFactory();

      //生产食物--烤鸭

      Food duckFood = foodFactory.createFood(DunckFood.class);

      duckFood.getName();

      duckFood.getPrice();

      //生产食物--鲍鱼

      Food fishFood = foodFactory.createFood(FishFood.class);

      fishFood.getName();

      fishFood.getPrice();

   }

}

工厂方法模式

定义一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类的创建过程中。

图解

经典代码

package com.cloud.model;

/*****************************************

 * 工人生产产品

 */

public class UsualProduct {

   Factory factory = new ConcreateFactory();

   Product product = factory.createProduct(ConcreateProduct.class);

   //处理实现其他的业务逻辑

}

/******************************************

 * 抽象产品类

 */

abstract class Product{

   //产品类的公共方法

   public void method1(){

      System.out.println("产品共有的方法:名称,价格等...");

   }

   //抽象方法

   public abstract void method2();

}

/**

 * 具体的产品类

 */

class ConcreateProduct extends Product{

   @Override

   public void method2() {

      System.out.println("具体产品类的处理逻辑...");

   }

}

/*************************************************

 * 抽象工厂

 */

abstract class Factory{

   public abstract <T extends Product> T createProduct(Class<T> c);

}

/**

 * 具体工厂类

 */

class ConcreateFactory extends Factory{

   @SuppressWarnings("unchecked")

   @Override

   public <T extends Product> T createProduct(Class<T> c) {

      Product product = null;

      try {

         product = (Product) Class.forName(c.getName()).newInstance();

      } catch (Exception e) {

         // 处理可能出现的异常

      }

      return (T) product;

   }

}

实际应用

工厂方法模式优点

1.      代码清楚,封装性比较好,扩展性比较好

2.      带有约束条件创建对象

简单工厂模式

package com.cloud.model2;

public class Demo1 {

   public static void main(String[] args) {

      Product concreateProduct = ConcreateFactory.createProduct(ConcreateProduct.class);

      concreateProduct.method1();

   }

}

/******************************************

 * 抽象产品类

 */

abstract class Product{

   //产品类的公共方法

   public void method1(){

      System.out.println("产品共有的方法:名称,价格等...");

   }

   //抽象方法

   public abstract void method2();

}

/**

 * 具体的产品类

 */

class ConcreateProduct extends Product{

   @Override

   public void method2() {

      System.out.println("具体产品类的处理逻辑...");

   }

}

/**

 * 具体工厂类

 */

class ConcreateFactory{

   /**

    * 这里修改为静态方法

    */

   @SuppressWarnings("unchecked")

   public static <T extends Product> T createProduct(Class<T> c) {

      Product product = null;

      try {

         product = (Product) Class.forName(c.getName()).newInstance();

      } catch (Exception e) {

         // 处理可能出现的异常

      }

      return (T) product;

   }

}

多工厂模式

package com.cloud.model2;

/*****************************************

 * 工人生产产品

 */

public class Demo2 {

   public static void main(String[] args) {

      Product duckProduct = (new DuckFactory()).createProduct();

      duckProduct.method1();

      Product fisProduct = (new FishFactory()).createProduct();

      fisProduct.method1();

   }

}

/******************************************

 * 抽象产品类

 */

abstract class Product{

   //产品类的公共方法

   public void method1(){

      System.out.println("产品共有的方法:名称,价格等...");

   }

   //抽象方法

   public abstract void method2();

}

/**

 * 具体的产品类

 */

class FishProduct extends Product{

   @Override

   public void method2() {

      System.out.println("食品种类:吃人鱼,100一条...");

   }

}

class DuckProduct extends Product{

   @Override

   public void method2() {

      System.out.println("食品种类:北京烤鸭,100一只...");

   }

}

/*************************************************

 * 抽象工厂

 */

abstract class Factory{

   public abstract Product createProduct();

}

/**

 * 具体工厂类:生产鱼类食品

 */

class FishFactory extends Factory{

   @Override

   public Product createProduct() {

      return new FishProduct();

   }

}

class DuckFactory extends Factory{

   @Override

   public Product createProduct() {

      // TODO Auto-generated method stub

      return new DuckProduct();

   }

}

工厂生产单例对象

class Singleton{

   private Singleton(){}

   public void method(){

      System.out.println("处理业务逻辑...");

   }

}

@SuppressWarnings({ "rawtypes", "unchecked" })

class SingletonFactory{

   private static Singleton singleton;

   static {

      try {

         Class c1 = Class.forName(Singleton.class.getName());

         Constructor constructor = c1.getDeclaredConstructor();

         constructor.setAccessible(true);

         singleton = (Singleton) constructor.newInstance();

      } catch (Exception e) {

         // TODO: handle exception

      }

   }

   public static Singleton getSingleton(){

      return singleton;

   }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值