生活场景
简单使用代码描述一个食品的加工和生产的过程,中间涉及到食品种类,生产工厂,工人等系列角色。
食品种类代码描述
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; } } |