day06_02_设计模式_工厂模式

Define an interface for creating on object, but let subclasses decide which class to instantiate Factory Method lets a class defer instantiation to subclasses.

定义一个用于创建对象的接口,让子类决定实例化哪一类。

抽象产品类Product : 产品的抽象,归纳

抽象创建类Creator : 基于抽象层面,关心的只是抽象层,而不关心子类。类似于接口编程

public abstract class Product {
//产品类的公共方法
public void method1(){
//业务逻辑处理
}
//抽象方法
public abstract void method2();
}
public abstract class Creator {
/*
* 创建一个产品对象,其输入参数类型可以自行设置
* 通常为String、Enum、Class等,当然也可以为空
*/
public abstract <T extends Product> T createProduct(Class<T> c);
}
public class ConcreteCreator extends Creator {
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;
}
}

例子:  造人 ,人类大致分为白种人,黑种人,黄种人 ,这三种人统称为人类Human,抽象归纳为接口Human,人的肤色,语言,文化不同,暂且俩个公共业务方法talk()和getColoe(),在此基础上,产品抽象类已经构思完成,工厂抽象类就在这里,使用反射,多态,泛型技术面向接口编程。

ad

public interface Human {
 public void getColor();
 public void talk();
}
public class WhiteMan implements Human {
 public void getColor() {
  System.out.println("白种人");
 }
 public void talk() {
  System.out.println("English");
 }
}
public abstract class AbstractFactory {
 public abstract <T extends Human> T createHuman(Class<T> c);
}
public class HumanFactory extends AbstractFactory {

 @Override
 public <T extends Human> T createHuman(Class<T> c) {
  Human human=null;
  try {
   human=(Human)Class.forName(c.getName()).newInstance();
  } catch (Exception e) {
   System.out.println("生产人失败");
  }
  return (T)human;
 }
}

 public static void main(String[] args) {
  AbstractFactory factory=new HumanFactory();
  WhiteMan whiteMan= factory.createHuman(WhiteMan.class);
  whiteMan.getColor();
  whiteMan.talk();
 }

优点:扩展性好,面向接口编程,拥抱变化,代码结构清晰。

核心思想 :  归纳出一类产品,其中的公共业务,那些不同,那些相同,根据这些写出抽象接口,然后扩展就变得非常简单了。

扩展1: 替代单例模式

扩展2: 仿写JDBC连接池(个人胡思乱想)

public class SingletonFactory {
 private static  Emperor emperor;   //参照上一篇博客

 static{
  try {
   Class cl=Class.forName(Emperor.class.getName()); //获取class对象
   Constructor constructor=cl.getDeclaredConstructor();    //获取构造方法
   constructor.setAccessible(true);      	 //设置构造方法为可访问
   emperor=(Emperor) constructor.newInstance();    //实例化
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public static Emperor getEmperor(){
  return emperor;
 }
} 
public class JDBCPool {
 private static final Map<String,Connection> prMap=new HashMap();
 private final static int MaxConections=5;  //最大连接数

 public static synchronized Connection createConnection(String connName){
  Connection con=null;
  if(prMap.size()<MaxConections){
   con=new Connection();
   prMap.put(connName, con);
  }
  return con;
 }
}

我是菜鸟,我在路上。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 22:01:59

day06_02_设计模式_工厂模式的相关文章

Java设计模式_工厂模式

简单工厂模式 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例.(不修改代码的话,是无法扩展的. ) 1 //产品接口 2 interface IProduct { 3 public void productName(); 4 } 5 6 //产品实体类 7 class ProductA implements IProduct { 8 @Override 9 public void productName() { 10 System.out.println("pr

PHP设计模式_工厂模式

个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数,只需要在工厂类里修改需要new的类名即可.如果我们不使用工厂方式实例化这些类,则需要每一个类都需要new一遍,过程不可控,类多了,到处都是new的身影引进工厂模式,通过工厂统一创建对象实例. 代码 简单案例① <

Spring设计模式_工厂模式

先说下工厂模式的特性 1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果. 2.工厂要对结果负责,保证生产出符合规范的产品. Git代码地址  https://github.com/wujiachengSH/WjcFactoryDemo 下述的3个栗子分别为简单工厂,工厂方法,抽象工厂 先来个栗子看看什么是工厂把 首先是简单工厂模式 声明一个动物工厂 1 package com.wjc.Factory; 2 3 public interface Animal { 4 5 Stri

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

JS 设计模式(工厂模式环境搭建)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(工厂模式)--> //搭建一个工厂环境 //卖车店 function CarShop(){}; CarShop.prototype={ cons

设计模式 5 —— 工厂模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模式 设计模式 5 -- 工厂模式,布布扣,bubuko.com

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta