介绍:
简单工厂模式是由一个工厂对象决定创建出哪个一种实体类的实例
。简单工厂模式是工厂模式家族中最简单使用的模式。封装实例化对象的行为
;大白话说:
你想要什么,告诉我,我给你就是了。
用出行的方式来举例子说明简单工厂模式。
假设人们需要出行时可以骑自行车,可以走路,可以坐公交,可以开私家车,还可以火车和飞机,当然了未来说不定还有飞船之类的。那么我们急用简单工厂模式来实现这个出行的功能:
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:49
* @Description:
*/
public abstract class GoOut {
//只是一个抽象的方法,具体的功能实现让交通工具去实现
public abstract void run();
}
(1)步行
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:51
* @Description: 步行
*/
public class Walk extends GoOut{
@Override
public void run() {
System.out.println("步行");
}
}
(2)骑自行车
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:53
* @Description: 骑自行车
*/
public class Bike extends GoOut{
@Override
public void run() {
System.out.println("骑自行车");
}
}
(3)开汽车
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:53
* @Description:开汽车
*/
public class Car extends GoOut {
@Override
public void run() {
System.out.println("开汽车");
}
}
接下来创建一个工厂类,功能是提供给用户的出行的方式,用户只需要告诉工厂类他需要什么方式就好了。
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 22:58
* @Description:为用户提供选择出行的方式。
*/
public class GoOutFactory {
public static GoOut createGoOut(String goOutType){
GoOut goOut = null;
switch (goOutType){
case "walk":
goOut = new Walk();
break;
case "bike":
goOut = new Bike();
break;
case "car":
goOut = new Car();
break;
}
return goOut;
}
}
package factory.simplefactory.goOut;
/**
* @Auther: truedei
* @Date: 2020 /20-4-26 23:03
* @Description:测试类
*/
public class TestGoOut {
public static void main(String[] args) {
GoOutFactory.createGoOut("car").run();
GoOutFactory.createGoOut("walk").run();
GoOutFactory.createGoOut("bike").run();
}
}
测试结果:
开汽车
步行
骑自行车
Process finished with exit code 0
文章作者:TrueDei 作者博客首页:http://truedei.blog.csdn.net 文章原文地址:https://cloud.tencent.com/developer/article/1670348
工厂方法模式:定义了一个用于创建对象的接口,让子类决定要实例化的类。工厂方法模式将一个类的实例化延迟倒子类。
有一个看书的程序,最初只有Python书。但是呢随着发展,也会有越来越多的书。
package factory.Product;
/**
* @Auther: truedei
* @Date: 2020 /20-4-28 09:02
* @Description:
*/
public class FactoryMethod {
public static void main(String[] args) {
Application application = new Application();
ProductPython ogject = application.getOgject();
ogject.method();
}
}
class ProductPython{
public void method(){
System.out.println("这是Python的产品类的方法");
}
}
class Application{
private ProductPython createProduct(){
return new ProductPython();
}
ProductPython getOgject(){
ProductPython product = createProduct();
return product;
}
}
为了公司业务的发展需求,可以使用工厂方法模式进行代码的重构。
/**
* @Auther: truedei
* @Date: 2020 /20-4-28 09:02
* @Description:
*/
public class FactoryMethod {
public static void main(String[] args) {
Application application = new CreateProductPython();
Product python = application.getObject();
python.method();
Application application1 = new CreateProductJava();
Product java = application1.getObject();
java.method();
}
}
//1、把公共的、稳定的方法给抽象出来
interface Product{
public void method();
}
class ProductPython implements Product{
public void method(){
System.out.println("这是Python的产品类的方法");
}
}
class ProductJava implements Product{
public void method(){
System.out.println("这是Java的产品类的方法");
}
}
class SimpleFactory{
public static Product createProduct(String bookType){
if(bookType.equals("python")){
return new ProductPython();
}else if(bookType.equals("Java")){
return new ProductJava();
}else {
return null;
}
}
}
abstract class Application{
abstract Product createProduct();
Product getObject(){
Product product = createProduct();
return product;
}
}
class CreateProductPython extends Application{
@Override
Product createProduct() {
return new ProductPython();
}
}
class CreateProductJava extends Application{
@Override
Product createProduct() {
return new ProductJava();
}
}
提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
开发一个数据库的组件。
可以看到针对的是数据库,那么数据库又有很多种类的数据库,例如:Mysql,Oracle等。
共性:
1、连接数据
2、执行数据库命令
3、等等…
package factory.abstractFactory;
/**
* @Auther: truedei
* @Date: 2020 /20-4-28 18:00
* @Description:抽象工厂模式
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
TrueDeiDatabaseUtils tdbu = new MysqlDataBaseUtils();
TrueDeiConnection connection = tdbu.getConnection();
connection.connect();//连接数据库
TrueDeiCommand command = tdbu.getCommand();
command.command();//发送命令
TrueDeiDatabaseUtils Otdbu = new MysqlDataBaseUtils();
TrueDeiConnection Oconnection = Otdbu.getConnection();
Oconnection.connect();//连接数据库
TrueDeiCommand Ocommand = tdbu.getCommand();
Ocommand.command();//发送命令
}
}
//抽象连接数据库的类
interface TrueDeiConnection{
public void connect();
}
//抽象关闭数据库连接的类
interface TrueDeiCommand{
public void command();
}
//工具类
interface TrueDeiDatabaseUtils{
//连接数据库
TrueDeiConnection getConnection();
//发送命令
TrueDeiCommand getCommand();
}
//实现Mysql的连接实例
class MysqlConnection implements TrueDeiConnection{
@Override
public void connect() {
System.out.println("连接mysql数据库");
}
}
//实现Mysql的发送命令的实例
class MysqlCommand implements TrueDeiCommand{
@Override
public void command() {
System.out.println("向mysql数据库发送命令");
}
}
//实现Mysql的工具类 有一组接口的是工厂模式,一个接口的是工厂方法模式
class MysqlDataBaseUtils implements TrueDeiDatabaseUtils{
@Override
public TrueDeiConnection getConnection() {
return new MysqlConnection();
}
@Override
public TrueDeiCommand getCommand() {
return new MysqlCommand();
}
}
//实现Mysql的连接实例
class OracleConnection implements TrueDeiConnection{
@Override
public void connect() {
System.out.println("连接Oracle数据库");
}
}
//实现Oracle的发送命令的实例
class OracleCommand implements TrueDeiCommand{
@Override
public void command() {
System.out.println("向Oracle数据库发送命令");
}
}
//实现Oracle的工具类
class OracleDataBaseUtils implements TrueDeiDatabaseUtils{
@Override
public TrueDeiConnection getConnection() {
return new OracleConnection();
}
@Override
public TrueDeiCommand getCommand() {
return new OracleCommand();
}
}
测试结果:
连接mysql数据库
向mysql数据库发送命令
连接mysql数据库
向mysql数据库发送命令
程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的具体类时,可以使用抽象工厂。
像连接数据库的jdbc的接口(Connection)等。